- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 JSoup 编写简单的 html 解析器。我有大约 50 000 个链接需要检查,所以我认为这是学习线程和并发的好机会。我已经向 ExecutorService 注册了 8 个任务:其中 6 个解析指向 ArrayList 中存储的某些数据的链接,然后将其添加到 BlockingQueues 中。其中两个任务是基于 BufferedWriter 的文件编写器。问题是当我的 6 个任务完成所有链接时,文件编写器停止从 BlockingQueue 写入数据,因此我丢失了部分数据。我是java新手,所以如果你能帮我......代码:
主文件:
public static void main(String[] args) {
BlockingQueue<ArrayList<String>> units = new ArrayBlockingQueue<ArrayList<String>>(50, true);
BlockingQueue<ArrayList<String>> subjects = new ArrayBlockingQueue<ArrayList<String>>(50, true);
File subjectFile = new File("lekarze.csv");
File unitFile = new File("miejsca.csv");
ExecutorService executor = Executors.newFixedThreadPool(9);
executor.submit(new Thread(new FileSaver(subjects, subjectFile)));
executor.submit(new Thread(new FileSaver(units, unitFile)));
for(int i = 29323; i < 29400; i++){
executor.submit(new ParserDocsThread(i, subjects, units, errors));
}
executor.shutdown();
}
FileSaver 类:
package parser;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.BlockingQueue;
public class FileSaver implements Runnable {
private BlockingQueue<ArrayList<String>> toWrite = null;
private File outputFile = null;
private BufferedWriter writer = null;
public FileSaver(BlockingQueue<ArrayList<String>> queue, File file){
toWrite = queue;
outputFile = file;
}
public void run() {
try {
writer = new BufferedWriter(new FileWriter(outputFile, true));
while(true){
try{
save(toWrite.take());
} catch(InterruptedException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void save(ArrayList<String> data){
String temp ="";
int size = data.size();
for(int i = 0; i < size; i++){
temp += data.get(i);
if(i != size - 1) temp += '\t';
}
try {
writer.write(temp);
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在 ParserDocsThread 中,我仅使用 put() 方法将元素添加到 BlockingQueue。
最佳答案
您的消费者线程没有干净地结束,因为 take()
调用正在等待新数组,并且没有关闭缓冲的写入器。 ServiceExecutor 放弃等待这些线程完成,并杀死它们。这导致写入器中的最后几行无法写入磁盘。
您应该使用poll(10, TimeUnit.SECONDS)
(但有适当的超时)。超时后,您的消费者将放弃生产者,您应该确保正确关闭缓冲写入器,以便正确打印缓冲区的最后一个内容。
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile, true)))
{
while(true){
List<String> data = toWrite.poll(10, TimeUnit.SECONDS);
if (data == null) {
break;
}
save(data, writer);
}
} catch (...) {
}
我已将这里的缓冲编写器放入 try-with-resources 中(因此这里的 try 会自动关闭编写器)并将其传递给您的保存方法,但您可以按照自己的方式进行操作,如果需要,可以在 finally block 中手动关闭编写器:
try {
...
} catch(...) {
} finally {
writer.close(); // Closes and flushes out the remaining lines
}
您可能还想在执行程序服务器上调用 awaitTermination
(如: How to wait for all threads to finish, using ExecutorService? ),等待时间大于轮询超时。
关于java - 当其他任务完成时,强制 BufferedWriter 从 BlockingQueue 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372459/
我正在使用一种简单的方法将字符串写入我的应用程序中的文件,如下所示: dateFormat = new SimpleDateFormat("dd MMMM YYYY HH:mm:ss"); cal =
File file = new File("result.csv"); FileWriter fw = new FileWriter(file.getAbsoluteFile()); Buffered
我必须从用户那里获取用户的姓名和地址并将其放入文本文件中。我写了以下代码: package selfTest.nameAndAddress; import com.intellij.codeInsig
我有以下示例应用程序,其中我写入文件,并在关闭编写器后立即尝试从文件中读取数据,但令我惊讶的是,没有任何内容写入文件。 我已经确保在读取文件之前调用了flush()和close()方法,但即使这样也对
我想将一些输入字符串设置为标准输入,以便另一个进程可以读取标准输入作为输入。我使用 Java BufferedWriter。但是,当输入字符串大于管道大小或其他进程无法读取时,如何处理这种情况?是否有
我有一种方法可以将 44 MB 的数据从 ResultSet 写入 CSV 文件。然而,完成大约需要 3.5 分钟。对于只有 44 MB 的数据来说,这似乎很慢。任何人都可以看到任何减慢我的代码速度的
我为 Android 4.1 或更高版本编写了一个小型演示应用程序,当单击按钮时,它应该使用 BufferedWriter 将字符串写入文件中,并且应该读取该字符串并将按钮的文本设置为此字符串。为了避
我有下面的代码片段。 Map globalMap = new HashMap(); File talendLogFile = new File("C:\\Softwares\\logFiles\\er
我有一个 BufferedWriter,它已经写入文件,但不是以我想要的方式。我在循环中初始化它,使其仅附加循环的最后一个结果以添加到文件中。实际上这对我来说没问题,但是文件中以前的结果被删除了。我希
这个问题已经有答案了: BufferedWriter not writing everything to its output file (8 个回答) 已关闭 8 年前。 所以我编写了一个程序,假设
我是否可以使用 BufferedWriter(或任何与此相关的编写器类)在无限循环的每次迭代期间将新行输出到文本文件,直到程序停止?据我了解,必须调用 BufferedWriter.close() 命
我想将一些字符串写入文件(使用 Java 8)。此代码片段编译时没有任何错误,但未写入文件....我是 noob ofcorz...有什么建议吗? import java.io.BufferedWri
我编写了一个方法来准备 SQL 插入语句并将它们存储在文本文件中。至此,它就完成了工作,但是我有一个完全碍眼的 catch block 。如果我能以某种方式关闭 BufferedReader 而无需隐
大家好,想知道是否可以帮助我,我正在尝试创建一个日志文件,其中保存用户选择的所有变量,到目前为止我已经得到: try{ String content = (" User : " +
我正在尝试重写这本字典:dictionary.txt按长度而不是按字母顺序排序。我有以下代码(在 main(String[] args) 内): BufferedReader read = n
我想读入一个文件并创建该文件的副本,但我的代码只写入文件中的最后一行。如何使每当我调用 write() 时,它都会写入新行。我想为副本创建一个新文件,因此无法将 true 添加到 FileWriter
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个 BufferedWriter ,用于写入刚刚在给定目录中创建的文件,但是,由于某种原因,它没有写入从另一个文件读取的文本,这是我的代码: private static final Strin
我必须从用户那里获取用户的姓名和地址并将其放入文本文件中。我写了以下代码: package selfTest.nameAndAddress; import com.intellij.codeInsig
我使用缓冲写入器将数组中的内容写入文本文件 try { File file = new File("Details.txt"); if (!file.exists()) {
我是一名优秀的程序员,十分优秀!