Como fazer Java ler arquivos muito grandes usando Scanner?
-
19-09-2019 - |
Pergunta
Eu estou usando a seguinte função básica que eu copiei a partir da rede para ler um arquivo de texto
public void read ()
{
File file = new File("/Users/MAK/Desktop/data.txt");
System.out.println("Start");
try
{
//
// Create a new Scanner object which will read the data from the
// file passed in. To check if there are more line to read from it
// we check by calling the scanner.hasNextLine() method. We then
// read line one by one till all line is read.
//
Scanner scanner = new Scanner(file);
int lineCount = 0;
if (scanner == null)
{
System.out.println("Null File");
}
else
{
System.out.println(scanner.toString());
}
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
System.out.println("Line " + lineCount +" contain : " + line);
lineCount++;
}
System.out.println("End of Try Bluck");
}
catch (FileNotFoundException e)
{
e.printStackTrace();
System.out.println("Exception Bluck");
}
System.out.println("End");
}
}
É bem com pequeno arquivo de tamanho médio e (que contêm 10-20000 linha de dados) que trabalham No entanto ele não conseguiu trabalho com um arquivo que contém 500 mil linhas. Eu não estou recebendo um erro (pelo menos não vendo ninguém). Então, o que está acontecendo? O que devo fazer aqui para ser capaz de pronto uma grande arquivos tais?
Nota: Eu já aumentou a pilha para 2 GB na máquina de teste que executa o Windows Server 2008 com 4 GB de RAM. mas isso não ajudou muito!
Por favor, alguém pode me dizer o que devo fazer aqui?
Atualização 01
O seguinte é a saída
Iniciar
java.util.Scanner [delimitadores = \ p {javaWhitespace} +] [position = 0] [partida válida = false] [entrada necessidade = false] [código fechado = false] [ignorada = false] [separador de grupo = \,] [decimal separador =.] [prefixo positivo =] [negativo prefixo = \ Q \ E] [sufixo positivo =] [sufixo negativo =] [cadeia = NaN \ Q \ E] [cadeia infinito = \ Q 8 \ E]
Fim da Try Bluck
Fim
Solução
Melhor ir para BufferedReader com um FileReader
Outras dicas
Se você não está recebendo um erro, ele poderia muito bem ser apenas a demorar muito tempo. É o disco ainda está ativa? O que você está fazendo com a saída do console - tem que parou? Você diz que "não funcionou", mas você não disse como ele é, na verdade, comportando. O que você está vendo?
A memória não deve ser um problema, você não está realmente fazendo alguma coisa com as linhas -. Apenas contá-los e gravá-los para o console
Um problema no seu código - você está verificando se scanner
é nulo, mas não pode possivelmente ser, porque você está usando a referência retornada por uma chamada do construtor. Que situação você estava tentando lidar com?