Depois de trabalhar, a tecnologia utilizada muda com as mudanças do projeto, ora C#, ora Java, e claro algumas outras tecnologias fragmentadas. No geral, C# leva mais tempo, seguido por Java. Não tenho nenhuma preferência por idiomas. Uma linguagem que pode funcionar é uma boa linguagem. E de uma perspectiva orientada a objetos, acho que não há diferença entre C# e Java para mim.
Este artigo revisa principalmente o conteúdo relacionado às operações de E/S em Java. A E/S também é um recurso básico das linguagens de programação e é dividida em dois tipos, um é a leitura sequencial e o outro é a leitura aleatória.
Vejamos primeiro a leitura sequencial. Existem duas maneiras de realizar a leitura sequencial. Uma é InputStream/OutputStream, que é um fluxo de entrada e saída que opera em bytes; fluxos da operação.
Abaixo desenhamos a estrutura do InputStream
FileInputStream: opera arquivos, geralmente usados em conjunto com BufferedInputStream
PipedInputStream: pode ser usado para comunicação entre threads
ObjectInputStream: pode ser usado para serialização de objetos
ByteArrayInputStream: usado para processar entrada de matrizes de bytes
LineNumberInputStream: pode gerar o número da linha atual e pode ser modificado no programa
A seguir está a estrutura de OutputStream
PrintStream: Fornece interfaces semelhantes a print e println para saída de dados
Vamos dar uma olhada em como usar o Stream para operar entrada e saída.
Lendo arquivos usando InputStream
Copie o código do código da seguinte forma:
Use FileInputStream para ler informações do arquivo
byte estático público [] readFileByFileInputStream (arquivo de arquivo) lança IOException
{
Saída ByteArrayOutputStream = new ByteArrayOutputStream();
FileInputStream fis = null;
tentar
{
fis = novo FileInputStream(arquivo);
byte[] buffer = novo byte[1024];
int bytesLeitura = 0;
while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
{
saída.write (buffer, 0, bytesRead);
}
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a leitura " + file.getAbsoluteFile());
}
finalmente
{
if (fis!=nulo) fis.close();
if (saída! = Nulo) saída.close();
}
retornar saída.toByteArray();
}
Lendo arquivos usando BufferedInputStream
Copie o código do código da seguinte forma:
byte estático público [] readFileByBufferedInputStream (arquivo de arquivo) lança exceção
{
FileInputStream fis = null;
BufferedInputStream bis = nulo;
Saída ByteArrayOutputStream = new ByteArrayOutputStream();
tentar
{
fis = novo FileInputStream(arquivo);
bis = novo BufferedInputStream(fis);
byte[] buffer = novo byte[1024];
int bytesLeitura = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
saída.write (buffer, 0, bytesRead);
}
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a leitura " + file.getAbsoluteFile());
}
finalmente
{
if (fis! = null) fis.close();
if (bis! = null) bis.close();
if (saída! = null) saída.close();
}
retornar saída.toByteArray();
}
Copie arquivos usando OutputStream
Copie o código do código da seguinte forma:
Copie arquivos usando FileOutputStream
public static void copyFileByFileOutputStream (arquivo de arquivo) lança IOException
{
FileInputStream fis = null;
FileOutputStream fos = null;
tentar
{
fis = novo FileInputStream(arquivo);
fos = new FileOutputStream(file.getName() + ".bak");
byte[] buffer = novo byte[1024];
int bytesLeitura = 0;
while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a cópia " + file.getAbsoluteFile());
}
finalmente
{
if (fis! = null) fis.close();
if (fos! = null) fos.close();
}
}
Copie o código do código da seguinte forma:
Copie arquivos usando BufferedOutputStream
public static void copyFilebyBufferedOutputStream (arquivo de arquivo) lança IOException
{
FileInputStream fis = null;
BufferedInputStream bis = nulo;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
tentar
{
fis = novo FileInputStream(arquivo);
bis = novo BufferedInputStream(fis);
fos = new FileOutputStream(file.getName() + ".bak");
bos = novo BufferedOutputStream(fos);
byte[] buffer = novo byte[1024];
int bytesLeitura = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
bos.write(buffer, 0, bytesRead);
}
bos.flush();
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a cópia " + file.getAbsoluteFile());
}
finalmente
{
if (fis! = null) fis.close();
if (bis! = null) bis.close();
if (fos! = null) fos.close();
if (bos! = null) bos.close();
}
}
O código aqui trata as exceções de maneira muito incompleta. Forneceremos um código completo e rigoroso posteriormente.
Vamos dar uma olhada na estrutura do Reader
O Reader aqui corresponde basicamente ao InputStream.
A estrutura do Writer é a seguinte
Vejamos alguns exemplos de uso do Reader ou Writer
Use o Reader para ler o conteúdo do arquivo
Copie o código do código da seguinte forma:
Use BufferedReader para ler o conteúdo do arquivo
public static String readFile (arquivo String) lança IOException
{
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
tentar
{
br = novo BufferedReader(novo FileReader(arquivo));
Linha de string = nulo;
while((linha = br.readLine()) != nulo)
{
sb.append(linha);
}
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a leitura " + arquivo);
}
finalmente
{
if (br != null) br.close();
}
retornar sb.toString();
}
Copie arquivos usando o Writer
Copie o código do código da seguinte forma:
Copie arquivos usando BufferedWriter
public static void copyFile (arquivo String) lança IOException
{
BufferedReader br = null;
BufferedWriter bw = null;
tentar
{
br = novo BufferedReader(novo FileReader(arquivo));
bw = novo BufferedWriter(novo FileWriter(arquivo + ".bak"));
Linha de string = nulo;
while((linha = br.readLine())!= null)
{
bw.write(linha);
}
}
catch(Exceção ex)
{
System.out.println("Ocorre erro durante a cópia " + arquivo);
}
finalmente
{
if (br != null) br.close();
if (bw! = null) bw.close();
}
}
Vejamos como realizar acesso aleatório a arquivos. RandomAccessFile é usado principalmente em Java para realizar operações aleatórias em arquivos.
Crie um arquivo de tamanho fixo
Copie o código do código da seguinte forma:
Crie arquivos de tamanho fixo
public static void createFile (arquivo String, tamanho int) lança IOException
{
Arquivo temporário = novo arquivo(arquivo);
RandomAccessFile raf = new RandomAccessFile(temp, "rw");
raf.setLength(tamanho);
raf.close();
}
Gravar dados aleatórios em um arquivo
Copie o código do código da seguinte forma:
Insira dados aleatórios em um arquivo
public static void writeFile (arquivo de string, byte [] conteúdo, int startPos, int contentLength) lança IOException
{
RandomAccessFile raf = new RandomAccessFile(new Arquivo(arquivo), "rw");
raf.seek(startPos);
raf.write(conteúdo, 0, contentLength);
raf.close();
}
A seguir, vamos dar uma olhada em algumas outras operações comuns
Mover arquivos
Copie o código do código da seguinte forma:
Mover arquivos
public static boolean moveFile (String sourceFile, String destFile)
{
Fonte do arquivo = novo arquivo(arquivofonte);
if (!source.exists()) throw new RuntimeException("arquivo fonte não existe.");
Arquivo destino = new Arquivo(arquivodest);
if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();
retornar origem.renameTo(dest);
}
Copiar arquivos
Copie o código do código da seguinte forma:
Copiar arquivos
public static void copyFile (String sourceFile, String destFile) lança IOException
{
Fonte do arquivo = novo arquivo(arquivofonte);
if (!source.exists()) throw new RuntimeException("Arquivo não existe.");
if (!source.isFile()) throw new RuntimeException("Não é arquivo.");
if (!source.canRead()) throw new RuntimeException("O arquivo não pode ser lido.");
Arquivo destino = new Arquivo(arquivodest);
if (dest.existe())
{
if (dest.isDirectory()) throw new RuntimeException("O destino é uma pasta.");
outro
{
destino.delete();
}
}
outro
{
Arquivo parentFolder = new Arquivo(dest.getParent());
if (!parentFolder.exists()) parentFolder.mkdirs();
if (!parentFolder.canWrite()) throw new RuntimeException("O destino não pode ser gravado.");
}
FileInputStream fis = null;
FileOutputStream fos = null;
tentar
{
fis = novo FileInputStream(fonte);
fos = novo FileOutputStream(dest);
byte[] buffer = novo byte[1024];
int bytesLeitura = 0;
while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(IOException ex)
{
System.out.println("Ocorre erro durante a cópia " + sourceFile);
}
finalmente
{
if (fis! = null) fis.close();
if (fos! = null) fos.close();
}
}
copiar pasta
Copie o código do código da seguinte forma:
copiar pasta
public static void copyDir (String sourceDir, String destDir) lança IOException
{
Fonte do arquivo = novo arquivo(sourceDir);
if (!source.exists()) throw new RuntimeException("A fonte não existe.");
if (!source.canRead()) throw new RuntimeException("A fonte não pôde ser lida.");
Arquivo destino = new Arquivo(destDir);
if (!dest.exists()) dest.mkdirs();
Arquivo[] arrFiles = source.listFiles();
for(int i = 0; i < arrFiles.length; i++)
{
if (arrFiles[i].isFile())
{
Leitor BufferedReader = new BufferedReader(new FileReader(arrFiles[i]));
Escritor BufferedWriter = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));
Linha de string = nulo;
while((linha = leitor.readLine()) != nulo) escritor.write(linha);
escritor.flush();
leitor.close();
escritor.close();
}
outro
{
copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
}
}
}
excluir pasta
Copie o código do código da seguinte forma:
excluir pasta
public static void del(String filePath)
{
Arquivo arquivo = new Arquivo(filePath);
if (arquivo == null || !file.exists()) return;
if (arquivo.isFile())
{
arquivo.delete();
}
outro
{
Arquivo[] arrFiles = arquivo.listFiles();
if (arrFiles.length > 0)
{
for(int i = 0; i < arrFiles.length; i++)
{
del(arrFiles[i].getAbsolutePath());
}
}
arquivo.delete();
}
}
Obtenha o tamanho da pasta
Copie o código do código da seguinte forma:
Obtenha o tamanho da pasta
public static long getFolderSize(String dir)
{
tamanho longo = 0;
Arquivo arquivo = novo arquivo(dir);
if (!file.exists()) throw new RuntimeException("dir não existe.");
if (arquivo.isFile()) return arquivo.length();
outro
{
String[] arrNomeArquivo = arquivo.lista();
for (int i = 0; i <arrNomeArquivo.comprimento; i++)
{
tamanho += getFolderSize(dir + "/" + arrNomeArquivo[i]);
}
}
tamanho de retorno;
}
Divida arquivos grandes em vários arquivos pequenos
Copie o código do código da seguinte forma:
Divida arquivos grandes em vários arquivos menores
public static void splitFile (String filePath, unidade longa) lança IOException
{
Arquivo arquivo = new Arquivo(filePath);
if (!file.exists()) throw new RuntimeException("arquivo não existe.");
tamanho longo = arquivo.comprimento();
if (unidade >= tamanho) return;
contagem int = tamanho% unidade == 0 ? (int)(tamanho/unidade) : (int)(tamanho/unidade) + 1;
String novoArquivo = null;
FileOutputStream fos = null;
FileInputStream fis=nulo;
byte[] buffer = novo byte[(int)unidade];
fis = novo FileInputStream(arquivo);
startPos longo = 0;
String contadorArquivo = caminhodoarquivo + "_Count";
Gravador PrintWriter = new PrintWriter(new FileWriter( new File(countFile)));
escritor.println(filePath + "/t" + tamanho);
for (int i = 1; i <= contagem; i++)
{
novoArquivo = caminho do arquivo + "_" + i;
startPos = (i - 1) * unidade;
System.out.println("Criando " + novoArquivo);
fos = new FileOutputStream(novo Arquivo(novoArquivo));
int bytesRead = fis.read(buffer, 0, buffer.length);
if (bytesLeitura! = -1)
{
fos.write(buffer, 0, bytesRead);
escritor.println(newFile + "/t" + startPos + "/t" + bytesRead);
}
fos.flush();
fos.close();
System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));
}
escritor.flush();
escritor.close();
fis.close();
}
Mesclar vários arquivos pequenos em um arquivo grande
Copie o código do código da seguinte forma:
Mesclar vários arquivos pequenos em um arquivo grande
public static void linkFiles (String countFile) lança IOException
{
Arquivo arquivo = new Arquivo(contaArquivo);
if (!file.exists()) throw new RuntimeException("O arquivo de contagem não existe.");
Leitor BufferedReader = novo BufferedReader(novo FileReader(arquivo));
String linha = leitor.readLine();
String novoArquivo = line.split("/t")[0];
tamanho longo = Long.parseLong(line.split("/t")[1]);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
raf.setLength(tamanho);
FileInputStream fis = null;
byte[] buffer = nulo;
while((linha = leitor.readLine()) != nulo)
{
String[] arrInfo = line.split("/t");
fis = new FileInputStream(new Arquivo(arrInfo[0]));
buffer = novo byte[Integer.parseInt(arrInfo[2])];
startPos longo = Long.parseLong(arrInfo[1]);
fis.read(buffer, 0, Integer.parseInt(arrInfo[2]));
raf.seek(startPos);
raf.write(buffer, 0, Integer.parseInt(arrInfo[2]));
fis.close();
}
raf.close();
}
Executar comando externo
Copie o código do código da seguinte forma:
Executar comando externo
public static void execExternalCommand (comando String, argumento String)
{
Processo processo = nulo;
tentar
{
process = Runtime.getRuntime().exec(comando + " " + argumento);
InputStream é = process.getInputStream();
BufferedReader br = novo BufferedReader(novo InputStreamReader(is));
Linha de string = nulo;
while((linha = br.readLine()) != nulo)
{
System.out.println(linha);
}
}
catch(Exceção ex)
{
System.err.println(ex.getMessage());
}
finalmente
{
if (processo! = nulo) process.destroy();
}
}