我有一个巨大的文本文件(207 MB,400万行),我需要逐行读取它.
每一行都有这种格式:
20227993821NAME AND SURNAME NINIC NN08
我使用(对于常规文件)Java库FileReader,BufferedReader如下所示:
FileReader dataFile = new FileReader(directory);
data = new BufferedReader(dataFile);
String s;
while((s = data.readLine()) != null){
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
没有问题,但是使用大文件需要花费太多时间来处理.
我想知道在这种情况下最好的做法是什么(另一个图书馆,不同的方法等),任何事情都会有所帮助.
该文件由政府机构定期发布,必须加载到我的软件中进行数据比较.
编辑:
这段代码:
BufferedReader data = new BufferedReader(new FileReader(file));
String s;
int count = 0;
while ((s = data.readLine()) != null) {
System.out.println (count + " - " + s);
count++;
}
data.close();
Run Code Online (Sandbox Code Playgroud)
在19分30秒内执行.我不知道为什么花这么长时间.
我有一个64位操作系统和一个i5处理器.
我想知道静态方法是否java.lang.Math.max(int a, int b)是线程安全的?
如果它不是线程安全的,你能解释一下这种方法由于多个线程的并发访问而带有错误输出的情况吗?
我必须在java中存储键值对,这样可以提高内存效率,并且在直接在文件中读写时更节省时间?
<string,double,double><string,object>中映射对象包含两个double值.<string,object>中的Hashmap,其中object包含两个double值.你也可以推荐一些其他的方法.
几乎所有平台的int都需要4个字节.Java参考怎么样?
Map<String, String> m = null;
Run Code Online (Sandbox Code Playgroud)
变量m占用32位/ 64位JVM的空间多少?
byte[] b = new byte[10];
Run Code Online (Sandbox Code Playgroud)
上面的字节数组占用10个字节,但是对b的引用需要多少额外空间?我认为b至少包括一个地址和一个长度,任何人都可以给我详细信息?
各位朋友,我正在制作一个程序,其中正在读取txt文件并显示输出.我正在使用FileReader和eclipse juno的编辑器.但是当我这样做时,我能够读取完整的txt文件,但不能读取第一个字符.例如,假设我们有txt文件,其中写有"斯巴达克斯自由",因此编译器必须在结果中显示整个字符串.而不是这个,它显示"斯巴达克斯的统治",因此没有显示第一个字符.这是我的代码:
package file;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class O
{
public static void main(String[] args) throws IOException
{
File f1=new File ("tj.txt");
FileReader f2=new FileReader(f1);
f2.read();
System.out.println("Starting TO Read");
long size=f1.length();
char[] x=new char[(int)size];
f2.read(x);
f2.close();
String s1=new String(x);
System.out.println(s1);
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题,任何人都能帮我解决这个问题吗?
我试图通过填充超过百万行来计算Arraylist和Linkedlist,并在Arraylist人口之后得到以下错误,
线程"main"中的异常java.lang.OutOfMemoryError:java.lang.Integer.valueOf(Integer.java:642)中的Java堆空间at scratch.Collectionss.main(Collectionss.java:25)
如何避免此错误,我尝试设置l1 = null但是这给了我一个错误,
public class Collectionss {
public static void main(String[] args){
//
long starttime = System.currentTimeMillis();
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10000000; i++){
l1.add(i);
}
System.out.println(l1.size());
long endtime = System.currentTimeMillis();
System.out.println(endtime - starttime);
//
long starttime1 = System.currentTimeMillis();
List<Integer> l2 = new LinkedList<Integer>();
for (int i = 1; i <= 10000000; i++){
l2.add(i);
}
System.out.println(l2.size());
long endtime1 = System.currentTimeMillis();
System.out.println(endtime1 - starttime1);
}
}
Run Code Online (Sandbox Code Playgroud) 我会从包中选择我想要的类会加快编译过程吗?例如,在包me.test中,我有50个classess,我只需要其中两个,我会做:
import me.test.{ classOne, classTwo}
Run Code Online (Sandbox Code Playgroud)
代替
import me.test._
Run Code Online (Sandbox Code Playgroud)
?谢谢
我正在编写一个程序,它有一个叫做data的双数组.
到目前为止,我的代码如下.
public class DataSet {
private double[] data;
private int dataSize;
public DataSet(){
dataSize = 0;
data = new double [10];
}
public void add(double x){
if(dataSize>= data.length){
double[] newData = new double[data.length*2];
System.arraycopy(data, 0, newData, 0, data.length);
newData=data;
newData[dataSize]=x;
dataSize++;
}
else{
data[dataSize] = x;
dataSize++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用add方法向数组添加新值.但是我不确定的是,当我这样做时
newData=data;
Run Code Online (Sandbox Code Playgroud)
我可以将此更改转到下一行吗?
data[DataSize] = x;
Run Code Online (Sandbox Code Playgroud)
我之所以要问的是,通过设置两个数组是否彼此相等,每当我调用数据时,我实际上是在调用newData.
是否有可能在Java中有多个堆?如果有可能那么它会在哪些情况下发生?
我的情况如下:我有一个Java程序,从此启动了一个perl脚本。Perl脚本正在生成一个文件,Java应该在该文件上继续工作。到现在为止,我已经设定了
Thread.sleep(3000);
Run Code Online (Sandbox Code Playgroud)
让Java等待文件完成。我一直在寻找一种更优雅的方法来让Java检查文件是否存在并继续。我最后的尝试是
Boolean waitforfile = true;
while(waitforfile){
File f = new File(pathtofile);
if(f.exists() && !f.isDirectory()) { waitforfile=false; }
}
Run Code Online (Sandbox Code Playgroud)
但这会让我陷入永无止境的循环中。还有其他方法吗?
更新:在建议上,尝试过,处理,WaitFor(); 在
public static String syscall(String call){
String out = "";
try {
String line;
Process p = Runtime.getRuntime().exec(call);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
out=out+"\n"+line;
}
input.close();
p.waitFor();
} catch (Exception e) {
System.out.println(e);
}
return out;
}
Run Code Online (Sandbox Code Playgroud)
这个没有等待我的perl进程被关闭。