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

我对执行此操作的最佳方法有些困惑。 我在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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值