A classe de arquivo Java
1. Visão geral
Neste tutorial, daremos uma visão geral da classeFile, que faz parte da APIjava.io. The File class gives us the ability to work with files and directories on the file system.
2. Criando um objetoFile
O sclassFile tem 4 construtores públicos. Dependendo das necessidades do desenvolvedor, diferentes tipos de instâncias da classeFile podem ser criados.
-
File(String pathname) - Cria uma instância que representa opathname fornecido
-
File(String parent, String child) - Cria uma instância que representa o caminho formado pela união dos caminhosparentechild
-
File(File parent, String child) - Cria uma instância com o caminho formado pela união do caminhoparent representado por outra posiçãoFile e o caminhochild
-
File(URI uri) - Cria uma instância que representa o determinado Uniform Resource Identifier
3. Trabalhando com a classeFile
A classeFile possui vários métodos que nos permitem trabalhar e manipular arquivos no sistema de arquivos. Vamos destacar alguns deles aqui. It is important to note that the File class cannot modify or access the contents of the file it represents.
3.1. Criando e excluindo diretórios e arquivos
A classeFile possui métodos de instância para criar e excluir diretórios e arquivos. Os diretórios e arquivos sãocreated using the mkdir and createNewFile methods, respectivamente.
Os diretórios e arquivos sãodeleted using the delete method. Todos esses métodos retornam um valorboolean que étrue quando a operação é bem-sucedida efalse caso contrário:
@Test
public void givenDir_whenMkdir_thenDirIsDeleted() {
File directory = new File("dir");
assertTrue(directory.mkdir());
assertTrue(directory.delete());
}
@Test
public void givenFile_whenCreateNewFile_thenFileIsDeleted() {
File file = new File("file.txt");
try {
assertTrue(file.createNewFile());
} catch (IOException e) {
fail("Could not create " + "file.txt");
}
assertTrue(file.delete());
}
No snippet acima, também vemosother helpful methods.
The isDirectory method pode ser usado para testar se o arquivo denotado pelo nome fornecido é um diretório, enquantothe isFile method pode ser usado para testar se o arquivo denotado pelo nome fornecido é um arquivo. E podemos usarthe exists method para testar se um diretório ou arquivo já existe no sistema.
3.2. Obtendo metadados sobre instâncias de arquivo
O sclassFile possui vários métodos que retornam metadados sobreFile ituações. Vamos ver como usar ogetName, getParentFile, and getPath methods:
@Test
public void givenFile_whenCreateNewFile_thenMetadataIsCorrect() {
String sep = File.separator;
File parentDir = makeDir("filesDir");
File child = new File(parentDir, "file.txt");
try {
child.createNewFile();
} catch (IOException e) {
fail("Could not create " + "file.txt");
}
assertEquals("file.txt", child.getName());
assertEquals(parentDir.getName(), child.getParentFile().getName());
assertEquals(parentDir.getPath() + sep + "file.txt", child.getPath());
removeDir(parentDir);
}
Aqui, ilustramos a validação dos metadados sobre o arquivo que foi criado dentro do diretório. Também mostramos como encontrar o pai do arquivo e o caminho relativo para esse arquivo.
3.3. Definindo permissões de arquivo e diretório
O sclassFile possui métodos que permitem definir permissões em um arquivo ou diretório. Aqui, veremossetWritable and setReadable methods:
@Test
public void givenReadOnlyFile_whenCreateNewFile_thenCantModFile() {
File parentDir = makeDir("readDir");
File child = new File(parentDir, "file.txt");
try {
child.createNewFile();
} catch (IOException e) {
fail("Could not create " + "file.txt");
}
child.setWritable(false);
boolean writable = true;
try (FileOutputStream fos = new FileOutputStream(child)) {
fos.write("Hello World".getBytes()); // write operation
fos.flush();
} catch (IOException e) {
writable = false;
} finally {
removeDir(parentDir);
}
assertFalse(writable);
}
No código acima, tentamos gravar em um arquivo depois de definir explicitamente permissões nele que bloqueiam qualquer gravação. Fazemos isso com o métodosetWritable. Attempting to write to a file when writing to the file is not permitted results in a IOException being thrown.
Em seguida, tentamos ler um arquivo depois de definir permissões nele que bloqueiam qualquer leitura. Reads are blocked using the setReadable method:
@Test
public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() {
File parentDir = makeDir("writeDir");
File child = new File(parentDir, "file.txt");
try {
child.createNewFile();
} catch (IOException e) {
fail("Could not create " + "file.txt");
}
child.setReadable(false);
boolean readable = true;
try (FileInputStream fis = new FileInputStream(child)) {
fis.read(); // read operation
} catch (IOException e) {
readable = false;
} finally {
removeDir(parentDir);
}
assertFalse(readable);
}
Novamente,the JVM will throw a IOException for attempts to read a file where reads are not permitted.
3.4. Listando arquivos dentro de um diretório
O sclassFile possui métodos que nos permitem listar arquivos contidos em um diretório. Da mesma forma, os diretórios também podem ser listados. Aqui, veremoslist and list(FilenameFilter) methods:
@Test
public void givenFilesInDir_whenCreateNewFile_thenCanListFiles() {
File parentDir = makeDir("filtersDir");
String[] files = {"file1.csv", "file2.txt"};
for (String file : files) {
try {
new File(parentDir, file).createNewFile();
} catch (IOException e) {
fail("Could not create " + file);
}
}
//normal listing
assertEquals(2, parentDir.list().length);
//filtered listing
FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv");
assertEquals(1, parentDir.list(csvFilter).length);
removeDir(parentDir);
}
Criamos um diretório e adicionamos dois arquivos a ele - um com a extensãocsve outro com a extensãotxt. Ao listar todos os arquivos no diretório, obtemos dois arquivos conforme o esperado. Quando filtramos a lista filtrando os arquivos com a extensãocsv, obtemos apenas um arquivo retornado.
3.5. Renomeando arquivos e diretórios
A classeFile tem a funcionalidade de renomear arquivos e diretóriosusing the renameTo method:
@Test
public void givenDir_whenMkdir_thenCanRenameDir() {
File source = makeDir("source");
File destination = makeDir("destination");
boolean renamed = source.renameTo(destination);
if (renamed) {
assertFalse(source.isDirectory());
assertTrue(destination.isDirectory());
removeDir(destination);
}
}
No exemplo acima, criamos dois diretórios - os diretórios de origem e de destino. Então,rename the source directory to the destination directory using the renameTo method. O mesmo pode ser usado para renomear arquivos em vez de diretórios.
3.6. Obtendo informações sobre espaço em disco
O sclassFile também nos permite obter informações de espaço em disco. Vamos ver umdemonstration of the getFreeSpace method:
@Test
public void givenDataWritten_whenWrite_thenFreeSpaceReduces() {
String home = System.getProperty("user.home");
String sep = File.separator;
File testDir = makeDir(home + sep + "test");
File sample = new File(testDir, "sample.txt");
long freeSpaceBefore = testDir.getFreeSpace();
try {
writeSampleDataToFile(sample);
} catch (IOException e) {
fail("Could not write to " + "sample.txt");
}
long freeSpaceAfter = testDir.getFreeSpace();
assertTrue(freeSpaceAfter < freeSpaceBefore);
removeDir(testDir);
}
Neste exemplo, criamos um diretório dentro do diretório inicial do usuário e, em seguida, criamos um arquivo nele. Em seguida, verificamos se o espaço livre na partição do diretório inicial havia sido alterado após o preenchimento desse arquivo com algum texto. Other methods that give information about disk space are getTotalSpace and getUsableSpace.
4. Conclusão
Neste tutorial, mostramos algumas das funcionalidades que a classeFile fornece para trabalhar com arquivos e diretórios no sistema de arquivos. .
Como sempre, o código-fonte completo do exemplo está disponívelover on Github.