Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的优化I/O操作?_Java_Io - Fatal编程技术网

Java中的优化I/O操作?

Java中的优化I/O操作?,java,io,Java,Io,我有一个文件“a.txt”,其中包含以下行: 14,15,16,17 13,16,15,14 15,17,12,13 ... ... 我知道每行总是有4列 我必须读取此文件并根据分隔符(这里是“,”)拆分行,并将每列的值写入其相应的文件中,即,如果列中的值为14,则必须在14.txt中转储/写入,如果是15,则将在15.txt中写入,依此类推 以下是我迄今为止所做的: Map <Integer, String> filesMap = new HashMap<Integer,

我有一个文件“a.txt”,其中包含以下行:

14,15,16,17
13,16,15,14
15,17,12,13
...
...
我知道每行总是有4列

我必须读取此文件并根据分隔符(这里是“,”)拆分行,并将每列的值写入其相应的文件中,即,如果列中的值为14,则必须在14.txt中转储/写入,如果是15,则将在15.txt中写入,依此类推

以下是我迄今为止所做的:

Map <Integer, String> filesMap = new HashMap<Integer, String>();
for(int i=0; i < 4; i++)
{
  filesMap.put(i, i+".txt"); 
}

File f = new File ("a.txt");
BufferedReader reader = new BufferedReader (new FileReader(f));
String line = null;
String [] cols = {};
while((line=reader.readLine()) != null)
{
    cols = line.split(",");
    for(int i=0;i<4;i++)
    {
        File f1 = new File (filesMap.get(cols[i]));
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(f1)));
        pw.println(cols[i]);
        pw.close();
    }   
}
Map filesMap=newhashmap();
对于(int i=0;i<4;i++)
{
put(i,i+“.txt”);
}
文件f=新文件(“a.txt”);
BufferedReader reader=新的BufferedReader(新文件读取器(f));
字符串行=null;
字符串[]cols={};
而((line=reader.readLine())!=null)
{
cols=行分割(“,”);

对于(int i=0;i这样的东西应该可以工作:

Map <Integer, PrintWriter> filesMap = new HashMap<>();
...
if(!filesMap.containsKey(cols[i]))
{
  //add a new PrintWriter
} else
{
  //use the existing one
}
Map filesMap=newhashmap();
...
if(!filesMap.containsKey(cols[i]))
{
//添加新的PrintWriter
}否则
{
//使用现有的一个
}
试试看

Set s=newhashset();
Scanner sc=new Scanner(新文件(“a.txt”)。使用分隔符([\n\r,]+”);
while(sc.hasNext()){
字符串n=sc.next();
若(补充(n)){
FileWriter w=新的FileWriter(n+“.txt”);
w、 写入(n);
w、 close();
}
}
sc.close();
公共静态void main(字符串[]args)引发异常{
FileReader fr=新的FileReader(“a.txt”);
BufferedReader读取器=新的BufferedReader(fr);
字符串行=”;
而((line=reader.readLine())!=null){
字符串[]cols=line.split(“,”);
对于(int i=0;i<4;i++){
FileWriter fstream=newfilewriter(cols[i]+“.txt”,true);//true用于在文件中追加数据。
BufferedWriter fbw=新的BufferedWriter(fstream);
fbw.write(cols[i]+“\n”);
fbw.close();
}
}
}

试试这个。我想你应该这样做。

看看附加到文件中,或者在最后做一次大规模的打开/关闭。输入文件“a.txt”将有112500行。因此,将完整数据存储在内存中是明智的选择吗?“即,如果列中的值为14,则必须在14.txt中转储/写入…”因此,在本文的结尾,文件
14.txt
将包含一堆值为
14
,等等的行,这毫无意义,更重要的是与您的代码冲突,您的代码似乎将所有第一列值写入
1.txt
,第二列值写入
2.txt
,等等。这是什么?@pst(1)为什么不呢?因为有一天,也许是今天,它将无法载入记忆为什么?如果你可以一次一行地处理数据,为什么不这样做?打开和关闭文件非常昂贵。我会不惜一切代价避免它。如果必须,你可以缓存所有打开的文件,但更好的解决方案是重新设计索引,这样你就不会使用多个文件。我想回答+1是。。这将是有效的,因为你不会每次都创建文件/写入程序。最后,你只需在地图中循环并关闭所有文件
    Set<String> s = new HashSet<>();
    Scanner sc = new Scanner(new File ("a.txt")).useDelimiter("[\n\r,]+");
    while(sc.hasNext()) {
        String n = sc.next();
        if (s.add(n)) {
            FileWriter w  = new FileWriter(n + ".txt");
            w.write(n);
            w.close();
        }
    }
    sc.close();
 public static void main(String[] args) throws Exception {
    FileReader fr = new FileReader("a.txt");
    BufferedReader reader = new BufferedReader(fr);
    String line = "";

    while ((line = reader.readLine()) != null) {
        String[] cols = line.split(",");
        for (int i = 0; i < 4; i++) {
            FileWriter fstream = new FileWriter(cols[i] + ".txt" , true);// true is for appending the data in the file.
            BufferedWriter fbw = new BufferedWriter(fstream);

            fbw.write(cols[i] + "\n");

            fbw.close();
        }
    }
}