Hur gör man för att läsa data och kopiera det till annan textfil?

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

Hur gör man för att läsa data och kopiera det till annan textfil?

package Kapitel9; import java.util.*; import java.io.*; public class Uppgift1_Kap9 { public static void main (String[] args) throws IOException{ Scanner sc = new Scanner(System.in); System.out.print("Infilens namn?"); System.out.flush(); String namn = sc.next(); BufferedReader inFil = new BufferedReader(new FileReader(namn)); int i; while((i = inFil.read())!=-1){ char c = (char)i; if(Character.isUpperCase(c)) Character.toLowerCase(c); BufferedWriter bw = new BufferedWriter(new FileWriter ("Hello2.txt")); bw.write(c); } } }

Det är min kod. Java skapar programmet Hello2.txt men textfil skapas tomt. Jag tror det finns fel i While satsen men har ingen aning hur ska jag byta det
Man ska inte ha någon system.out.print för att skriva ut texter från textfil.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Du skapar din FileWriter inuti while-loopen, så du kommer alltså öppna filen för varje karaktär du skriver. Och eftersom standardläget för FileWriter är att skriva över allt i filen så bör Hello2.txt till slut innehålla endast det sista tecknet från filen som du läser ifrån, vilket troligtvis är ett nyradstecken (och alltså osynligt). Flytta bw till ovanför while-loopen så att ut-filen bara öppnas en gång så kommer det säkert gå bättre.

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
Skrivet av perost:

Du skapar din FileWriter inuti while-loopen, så du kommer alltså öppna filen för varje karaktär du skriver. Och eftersom standardläget för FileWriter är att skriva över allt i filen så bör Hello2.txt till slut innehålla endast det sista tecknet från filen som du läser ifrån, vilket troligtvis är ett nyradstecken (och alltså osynligt). Flytta bw till ovanför while-loopen så att ut-filen bara öppnas en gång så kommer det säkert gå bättre.

Tack för din respons!
Men Jag tänkte det också i början. Men om man flyttar ut bw från while satsen, Java visar att jag måste skapa ny lokal variabel c.
Om man skapar det, java visar att initialisera det till 0 (resultat är samma)
Därför jag tänkte att bw kanske ska liggas i while-satsen

Jag tror att problemet beror på att FileWriter får inget data från textfilen.. eftersom om jag lägger till system.out.print(c) i while-satsen och till Character.toLowerCase, programmet visar data från textfil allt bra. Men problem är att i uppgiften står att man ska inte ha någon utskrift..

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Du måste självklart ha bw.write(c); innanför while-loopen. Även om du följer en bok skulle jag rekommendera att faktiskt funderar på vad koden gör också, av dina frågor att döma verkar du skriva kod utan att veta varför.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av ProgrammeringElev:

package Kapitel9; import java.util.*; import java.io.*; public class Uppgift1_Kap9 { public static void main (String[] args) throws IOException{ Scanner sc = new Scanner(System.in); System.out.print("Infilens namn?"); System.out.flush(); String namn = sc.next(); BufferedReader inFil = new BufferedReader(new FileReader(namn)); int i; while((i = inFil.read())!=-1){ char c = (char)i; if(Character.isUpperCase(c)) Character.toLowerCase(c); BufferedWriter bw = new BufferedWriter(new FileWriter ("Hello2.txt")); bw.write(c); } } }

Det är min kod. Java skapar programmet Hello2.txt men textfil skapas tomt. Jag tror det finns fel i While satsen men har ingen aning hur ska jag byta det
Man ska inte ha någon system.out.print för att skriva ut texter från textfil.

Med Java 8 går detta att beskriva på ett enklare sätt:

public void convertToLowerCase(Path in, Path out) { // Finess #1 från Java8: try-with-resources, stänger automatiskt resursen om ett fel uppstår // Finess #2: Streams. Data går direkt från infilen till utfilen utan att allting mellanlagras i datorns minne. try (Stream<String> lines = Files.lines(in)) { // Finess #3: Method references. lines.map(String::toLowerCase) kan även skrivas lines.map(line -> line.toLowerCase()) Iterable<String> lowercased = lines.map(String::toLowerCase)::iterator; Files.write(out, lowercased); } catch (IOException e) { e.printStackTrace(); } }

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
Skrivet av perost:

Du skapar din FileWriter inuti while-loopen, så du kommer alltså öppna filen för varje karaktär du skriver. Och eftersom standardläget för FileWriter är att skriva över allt i filen så bör Hello2.txt till slut innehålla endast det sista tecknet från filen som du läser ifrån, vilket troligtvis är ett nyradstecken (och alltså osynligt). Flytta bw till ovanför while-loopen så att ut-filen bara öppnas en gång så kommer det säkert gå bättre.

Skrivet av Tazavoo:

Du måste självklart ha bw.write(c); innanför while-loopen. Även om du följer en bok skulle jag rekommendera att faktiskt funderar på vad koden gör också, av dina frågor att döma verkar du skriva kod utan att veta varför.

Skrivet av Teknocide:

Med Java 8 går detta att beskriva på ett enklare sätt:

public void convertToLowerCase(Path in, Path out) { // Finess #1 från Java8: try-with-resources, stänger automatiskt resursen om ett fel uppstår // Finess #2: Streams. Data går direkt från infilen till utfilen utan att allting mellanlagras i datorns minne. try (Stream<String> lines = Files.lines(in)) { // Finess #3: Method references. lines.map(String::toLowerCase) kan även skrivas lines.map(line -> line.toLowerCase()) Iterable<String> lowercased = lines.map(String::toLowerCase)::iterator; Files.write(out, lowercased); } catch (IOException e) { e.printStackTrace(); } }

Tack alla för snälla svar!!