我对执行此操作的最佳方法有些困惑。 我在SO上看到了很多示例,许多答案有不同的解决方案。 因此,我想知道将非常长的字符串写入新的html文件的最有效方法(即,从字符串中生成html文件)。 并且真的可以将所有内容包装到缓冲区中吗? 喜欢:

fileWriter = new FileWriter(new File(dir, appBook.getPath()));

bufferWritter = new BufferedWriter(fileWriter);

bufferWritter.append(htmlContent);

或者我可以做些什么(而不失去性能)

fileWriter = new FileWriter(new File(dir, appBook.getPath()));

fileWriter .append(htmlContent);

..

这是我现在已经使用了一段时间的方法:

//Will run out of memory if i dont split the string in 650000 chunks

String[] bookPieces = splitString(htmlContent, Math.round(htmlContent.length()/650000));

OutputStream outputStream = null;

InputStream inputStream = null;

try {

outputStream = new FileOutputStream(new File(dir, appBook.getPath())); //.html path

for (String text : bookPieces) {

byte[] theBytes = text.getBytes(Charset.forName("UTF-16"));

inputStream = new ByteArrayInputStream(theBytes);

byte[] bufferData = new byte[1024];

int bytesRead = inputStream.read(bufferData);

while (bytesRead != -1) {

outputStream.write(bufferData, 0, bytesRead); //add the bufferData data to the "new file"

bytesRead = inputStream.read(bufferData); // keep on reading and filling the dynamic byte araay until it returns -1

}

//need to GC the inputsteam myself!!!!

inputStream = null;

}

toReturn = true;

}

比起我,我更倾向于将BufferedReader用于长文本字符串。 所以我改为:

String[] bookPieces = splitString(htmlContent, Math.round(htmlContent.length()/650000));

OutputStream outputStream = null;

InputStream inputStream = null;

OutputStreamWriter oo;

try {

outputStream = new FileOutputStream(new File(dir, appBook.getPath()));

for (String text : bookPieces) {

byte[] theBytes = text.getBytes(Charset.forName("UTF-16"));

inputStream = new ByteArrayInputStream(theBytes);

InputStreamReader iReader = new InputStreamReader(inputStream,Charset.forName("UTF-16"));

BufferedReader bufferedReader = new BufferedReader(iReader);

oo = new OutputStreamWriter(outputStream);

String nextLine;

while ((nextLine = bufferedReader.readLine())!=null) {

oo.write(nextLine);

}

//need to GC the inputsteam myself!!!!

inputStream = null;

}

但是我无法使用该方法正确编码,某些字符会有所不同,例如“ —”变为“〔。 而且我仍然必须将字符串分成多个块,因此我看不到更改的目的(我是用错误的方式实现的吗?请告诉我使用bufferedReader的正确方法)。

...然后我终于找到了两种更快的方法,甚至不需要我将字符串分块成这么多块。

String[] bookPieces = splitString(htmlContent, Math.round(htmlContent.length()/100));

FileWriter fileWriter = null;

BufferedWriter bufferWritter = null;

try {

fileWriter = new FileWriter(new File(dir, appBook.getPath()));

bufferWritter = new BufferedWriter(fileWriter);

//Has to append, if write than OOM.

bufferWritter.append(htmlContent);

toReturn = true;

}

//比起带有Encoding的代码要慢得多

//Need to split large strings in 100 chuncks

String[] bookPieces = splitString(htmlContent, Math.round(htmlContent.length()/100));

BufferedWriter bufferWritter = null;

OutputStreamWriter osw= null;

try {

// Create osw and assign it an Encoding

osw = new OutputStreamWriter(

new FileOutputStream(new File(dir, appBook.getPath())),

Charset.forName("UTF-16"));

bufferWritter = new BufferedWriter(osw);

for (String text : bookPieces) {

bufferWritter.write(text); //write faster than append here

}

toReturn = true;

}

java结果写入html,java - 将长字符串写入HTML文件,InputStream vs FileWriter vs BufferedReader - 堆栈内存溢出...相关推荐

  1. linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...

    我在做什么? 我正在用Java编写一个数据分析程序,该程序依赖R的arulesViz库来挖掘关联规则. 我想要什么? 我的目的是将规则存储在Java中的String变量中,以便以后进行处理. 它是如何 ...

  2. if函数中的android,java - 我需要帮助将IF语句方法更改为Android Studio中的SWITCH情况 - 堆栈内存溢出...

    我正在Android Studio上的一个项目上工作,并且正在尝试创建过滤器. 我向其中添加了一些Checkboxes ,我想用它过滤我的RecyclerView . 使用IF语句,我可以做到,但是据 ...

  3. java获取excel文件第一行_java - 在Java中读取Excel文件,但第一行除外 - 堆栈内存溢出...

    我正在尝试从使用xlsx文件的JasperReport模板自动创建报告,我用来从excel文件读取的方法是这样的: String[] columnNames = new String[]{" ...

  4. java图片强绘制表情符号_java - 具有表情符号的Graphics2D.drawString()无法正常工作 - 堆栈内存溢出...

    如果我将代码打包为.jar而不是仅使用classpath,则无法正常工作(就像我在IDE中按"播放"一样) 当我使用IDE时,可以使用g2.drawString (使用Apple ...

  5. java url 双引号_java - Java在POST请求中发送带有转义双引号的JSON字符串[duplicate] - 堆栈内存溢出...

    我正在创建一个JSONObject并将JSON字符串发送到POST请求正文中的服务器. public String toJson() { JSONObject filter = new JSONObj ...

  6. java字符串转语音文件_java - Java文字转语音(Spring Boot) - 堆栈内存溢出

    我从事的项目是必须使用SpringBoot生成验证码. 我想要一个"文本到语音"功能,并且声音文件必须使用SpringBoot生成(否则这将是一个巨大的安全问题). 我生成了一个验 ...

  7. pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...

    我正在从n个页面的输入pdf文件中读取特定位置,并在这些位置上列出文本. 然后,我编写一个新的pdf文档,并将列表中的这些字符串写入包含单元格的表中. 我提出了两个主要问题. 我想在表中有三列,但是如 ...

  8. java jini dll_java - Jini / JavaSpaces发现错误 - 堆栈内存溢出

    我在Eclipse中编写了这些类,并启动了Launch-All脚本和Run示例. 有用. 之后,我将这些类导出到可执行的jar(JavaSpaceClient.jar)中,并使用以下命令尝试了该jar ...

  9. java解析odt_java - 使用Java从odt文件读取XForm - 堆栈内存溢出

    我设法通过jdom(odfdom-java)做到了这一点,毕竟一点都没有使用过. 绑定的xml本身存在于表示odt的xml中. 您只需要知道表单的ID或标签的名称,即可获得正确的节点. 之后,将构造一 ...

最新文章

  1. 一些常用的图像数据库总结
  2. LeetCode【13--罗马数字转整数】LeetCode【14--最长的公共前缀】
  3. 「刷新 CTO」微软与 CSDN 的 CTO 转型思想汇
  4. 想多了!亚马逊中国没有离开 | 畅言
  5. 《linux核心应用命令速查》连载八:kill:杀掉进程
  6. UNIX环境高级编程之第6章:系统数据文件和信息
  7. 基于M.2接口的SATA3协议和PCIE协议的SSD接口定义
  8. Linux消息队列的设置及查看
  9. 红绿3d眼镜与红蓝3d眼镜区别_3D眼镜是指什么原理?
  10. 手把手教你集成Andriod百度地图SDK
  11. angr源码分析——数据依赖图 DDG
  12. 小码哥php教程,小码哥Java从0到高级工程师
  13. 《算法笔记》胡凡——4.2散列
  14. python打印七段数码管引脚图_前辈学51单片机的感悟是怎么样的?说说看
  15. 为什么电磁炉加热一会就停了 电磁炉加热原理与维修技巧一点通_电磁炉电路图讲解
  16. Odoo产品分析 (三) -- 人力资源板块(7) -- 费用追踪(1)
  17. 我的网安之路——2020年总结
  18. 中国“苹果皮”之父:希望与苹果公司展开合作
  19. 微信小程序开发 01
  20. 足球分析大小球开发成量化交易软件

热门文章

  1. 蓝桥杯——2018第九届C/C++真题[省赛][B组]
  2. python提取word文件中的图片,并上传阿里云OSS,返回html图片标签
  3. 羽毛球拍怎么选?如何挑选适合自己的羽毛球拍?
  4. Java简介、应用领域和就业前景分析
  5. 游图邦YOTUBANG的格局与文化
  6. 美语音标 [ɪ]在下列情况要发[i]的音
  7. Django-discount策略解耦实现
  8. 蓝桥杯学习记录||ALGO-1004 无聊的逗
  9. 【思科模拟器实验】静态路由和默认路由
  10. 阿里云服务器安装配置流程