gpt4 book ai didi

java - 将长字符串写入 HTML 文件,InputStream、FileWriter 与 BufferedReader

转载 作者:行者123 更新时间:2023-12-01 11:42:08 25 4
gpt4 key购买 nike

我对执行此操作的最佳方法有点困惑。我在这里看到了很多关于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;

}

但是我无法使用该方法获得正确的编码,某些字符会有所不同,例如“—”变成“〔。而且我仍然必须将字符串分成 block ,所以我看不到改变的目的(我是否以错误的方式实现了这一点?请告诉我使用 bufferedReader 执行此操作的正确方法)。

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

    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;

}

最佳答案

这是一种简单但更高效的编写代码的方式,IMO:

int buffSize = Math.min(65536, htmlContent.length());
try (Writer osw = new OutputStreamWriter(
new FileOutputStream(new File(dir, appBook.getPath())),
Charset.forName("UTF-16"));
BufferedWriter bw = new BufferedWriter(osw, buffSize)) {
bw.write(htmlContent);
}

代码注释:

  1. 此版本不会拆分文本。 BufferedWriter.write(String) 代码根据 BufferedWriter 的缓冲区大小提取、转换并写出 block 中的字符串字符。自己进行分块是没有意义的。

  2. 此版本根据要写入的字符串的大小设置 BufferedWriter 的缓冲区大小。但超过一定大小(猜测为 65K)时,通过增加缓冲区大小就无法获得任何性能优势。

  3. 该版本使用“try with resources”来防止资源泄漏。

<小时/>

进一步的想法。

使用 NIO 可能会获得更高的性能。

通过使用令人讨厌的反射来访问String对象的私有(private)字符数组,可能会获得更高的性能。 (不要这样做。这是一个坏主意!)

更好的方法可能是不要将 HTML 组装为巨大的字符串。相反,将组成 HTML 的字符/字符串直接写入 BufferedWriter。这样就无需将整个 HTML 一次性保存在内存中1

<小时/>

1 - 假设您使用的 StringBuilder 没有良好的大小提示,您将需要最多 3N 个 char[] 字符来组装一个字符串大小 N。如果你有一个好的大小提示,你只需要 2N 个字符......

关于java - 将长字符串写入 HTML 文件,InputStream、FileWriter 与 BufferedReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29440867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com