我喜欢我的程序来获取文件,然后根据其字节内容创建4个文件。
仅使用主线程,我只创建一个DataInputStream
并按顺序执行我的操作。
现在,我有兴趣让我的程序并发。也许我可以有四个线程 - 每个文件要创建一个。
我不想一次性将文件的字节读入内存,因此我的线程需要不断查询DataInputStream
以使用read()
来传输字节。
我不清楚的是,如果我的4个帖子在read()
上调用DataInputStream
,或者每个帖子是否都有自己独立的流来读取?
答案 0 :(得分:2)
我不认为这是个好主意。见http://download.java.net/jdk7/archive/b123/docs/api/java/io/DataInputStream.html
DataInputStream对于多线程访问不一定安全。线程安全是可选的,是本课程方法用户的责任。
答案 1 :(得分:1)
假设您需要四个新文件中的每个文件中的所有数据,则每个线程都应创建自己的DataInputStream。
如果线程共享一个DataInputStream,那么每个线程最多只能获得一些随机数据。在最坏的情况下,由于对非线程安全的代码进行多线程访问,您将导致崩溃或数据损坏。
答案 2 :(得分:0)
如果要将1个文件中的数据读入4个单独的文件,则不会共享DataInputStream。但是,您可以包装该流并添加使其成为线程安全的功能。
例如,您可能希望从DataInputStream中读取一大块数据并缓存该小块。当所有4个线程都已读取块时,您可以将其丢弃并继续读取。您永远不必将完整的文件加载到内存中。你只需加载少量。
答案 3 :(得分:0)
如果你看一下DataInputStream的文档。它是一个FilterInputStream,这意味着将读操作委托给其他inputStream。假设你在这里使用的是FileInputStream,在大多数平台上,将支持并发读取。
所以在你的情况下,你应该初始化四个不同的FileInputStream,得到四个DataInputStream,分别在四个线程中使用。读操作不会受到干扰。
答案 4 :(得分:0)
简短的回答是否定的。
更长的答案:让一个线程读取DataInputStream,并将数据放入四个队列中的一个,每个输出文件一个。根据字节内容确定哪个队列。
有四个线程,每个线程从队列中读取,写入输出文件。