"Hej, Amigo. Länge, inte sett."

"Hej Bilaabo. Vad ska du prata om?"

"Idag ska jag berätta om att arbeta med filer.  Java har en speciell klass (File) som du kan använda för att hantera filer på en hårddisk. För att hantera filinnehåll finns det andra klasser: FileInputStream, FileOutputStream, osv. "

Fil, filer, sökväg - 1

"Intressant. Men när du säger 'hantera filer', vad menar du?"

"Det är precis vad jag ska förklara nu. Filer kan skapas, raderas, döpas om och mycket mer. Du kan skicka ett File-objekt till praktiskt taget varje klass som arbetar med (läser, skriver, ändrar) innehållet i en fil . Till exempel:"

Du kan skicka filnamnet direkt till FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Eller så kan du skapa ett filobjekt separat och sedan skicka det till FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Men det andra alternativet är längre. Jag förstår fortfarande inte varför vi behöver dessa filobjekt."

"För det här specifika exemplet har du rätt. "Det här är inte ett exempel på hur du måste göra det, utan snarare hur du kan göra det.
Men föreställ dig att du måste visa en lista över alla filer som finns i en specifik katalog. Så här kan detta göras med hjälp av filobjekt:"

Koda
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Är listFiles() en metod som returnerar en lista med filer i mappen indikerad av «c:/path/»?"

"Ja. Men programmerare brukar säga 'katalog'. Termen 'mapp' kom till användning relativt nyligen, men i princip är båda termerna korrekta och du kan säga vilken du föredrar."

"OK. Och vad gör getName ()? Returnera namnet på filen? Vad exakt ingår i namnet? Det fullständiga namnet inklusive sökvägen, eller bara namnet på själva filen?"

"Endast namnet på själva filen. För den fullständiga sökvägen finns file.getAbsolutePath()."

"Så vilka andra metoder har klassen File?"

"Titta på det här:"

Metod Beskrivning
boolean isDirectory() Är File-objektet en katalog?
boolean isFile() Är objektet en fil?
long length() Returnerar filstorleken/längden i byte.
boolean createNewFile() Skapar en ny, tom fil om en fil med detta namn ännu inte existerar.
boolean mkdir() Skapar en katalog. Namnet «mkdir» kommer från «make directory».
boolean mkdirs() Skapar en katalog och alla dess underkataloger.
boolean delete() Tar bort filen som är associerad med objektet. Om objektet är en katalog, raderas katalogen endast om det inte finns några filer i den.
void deleteOnExit() Lägger till filen i en speciell lista med filer som kommer att raderas automatiskt när programmet avslutas.
File createTempFile(
String prefix,
String suffix,
File directory)
Skapar en temporär fil med ett slumpmässigt genererat unikt namn, ungefär som «dasd4d53sd».
Ytterligare parametrar är ett namnprefix och suffix. Om en katalog inte anges skapas filen i en speciell OS-katalog för temporära filer.
boolean exists() Returnerar sant om en fil med samma namn finns på hårddisken.
String getAbsolutePath() Returnerar hela sökvägen till filen med alla dess underkataloger.
String getCanonicalPath() Returnerar den kanoniska filsökvägen.
Konverterar till exempel sökvägen «c:/dir/dir2/../a.txt» till «c:/dir/a.txt»
String[] list() Returnerar en matris med namn på filer som finns i katalogen som representeras av det aktuella objektet.
File[] listFiles() Returnerar en array av filer som finns i katalogen som representeras av det aktuella File-objektet.
long getTotalSpace() Returnerar mängden totalt utrymme (antal byte) på disken där filen finns.
long getFreeSpace() Returnerar mängden ledigt utrymme (antal byte) på disken där filen finns.
boolean renameTo(File) Byter namn på filen, dvs innehållet i filen får faktiskt ett nytt namn. Med andra ord kan du byta namn på filen «c:/dir/a.txt» till «d:/out/text/b.doc».
String getName() Returnerar endast filnamnet utan sökvägen.
String getParent() Returnerar endast sökvägen (katalogen) till den aktuella filen, utan själva namnet.
Path toPath() Returnerar ett sökvägsobjekt som motsvarar det aktuella filobjektet.

"Oj! Inte en väldigt liten lista, va? Och det verkar som att du kan göra ganska mycket med den: skapa och ta bort filer, byt namn på dem,..."

"Så för att få katalogen för den aktuella filen måste jag anropa getParent()?"

"Japp, men den returnerar en String - filsökvägen - inte ett File-objekt. Faktum är att klassen File duplicerar nästan alla sina metoder: en version returnerar en String, den andra - ett File-objekt. Kolla in det:"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Om du har en sträng med filsökvägen och du behöver ett filobjekt , använd sedan konstruktorn. Om situationen är omvänd (du har ett File- objekt men du behöver en sträng), använd sedan getAbsolutePath (). Till exempel:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"Jag fattar."

"Bra. Här är en liten uppgift för dig: visa namnen på alla filer som finns i samma katalog som den aktuella filen."

"Ingenting kunde vara lättare. Här, titta:"

Koda
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Hmm. Rätt."

"Men det är lite förvirrande att samma klass ― File ― används för både filen och katalogen. Det verkar inte särskilt logiskt för mig."

"Det fungerade så av historiska skäl. En katalog brukade vara en speciell "tom" fil på disken. Naturligtvis har mycket förändrats nu, men inte allt. Det är allt jag har idag."

"Tack för den intressanta lektionen, Bilaabo."