Often I write notes about a topic into a simple text file when I learn something. Sometimes i work with these text file on other computers with a different screen resolution. So sometimes the lines of the file are to long for printing them in one displaying line.
I have written a program that solves that problem. I want to know what you think about my design.
Usage:
java Sequence inputFile outputFile charsPerLine
Code:
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.IOException;
public class Sequence {
private String inputFileName;
private String outputFileName;
private File inputFile;
private File outputFile;
private String[] symbols;
private int symbolsUsed;
private int lineLength;
public Sequence (String inputFileName, String outputFileName, int lineLength, boolean doWork) throws Exception {
inputFile = new File(inputFileName);
outputFile = new File(outputFileName);
this.lineLength = lineLength;
symbolsUsed = 0;
if(doWork) {
analyzeSymbols();
writeToFile();
}
}
public void analyzeSymbols() throws Exception {
symbols = new String[10000];
for(int i = 0; i < 10000; i++) {
symbols[i] = "";
}
FileReader fr = new FileReader(inputFile);
int n = 0;
char c = 0;
while (n != -1) {
n = fr.read();
c = (char)n;
if (c == '\n') {
symbolsUsed++;
symbols[symbolsUsed] = "force newline";
symbolsUsed++;
} else if (c == ' '){
symbolsUsed++;
} else if (c == '\t') {
symbols[symbolsUsed] += c;
symbolsUsed++;
} else {
symbols[symbolsUsed] += c;
}
}
symbolsUsed++;
}
public void writeToFile() throws Exception {
String text = "";
int actualLineLength = 0;
boolean lineWithT = false; // \t
String tString = "";
int numberOfT = 0;
int i = 0;
while(i < symbolsUsed) {
if(actualLineLength + symbols[i].length() + 1 <= lineLength && !symbols[i].equals("\t") && !symbols[i].equals("force newline")) {
text += symbols[i] + " ";
actualLineLength += symbols[i].length() + 1;
i++;
} else if (symbols[i].equals("\t")) {
lineWithT = true;
tString = "\t";
actualLineLength += 4; // i hope that the used editor marks a \t with 4 whitespace symbols, should be standard
i++;
numberOfT++;
while(symbols[i].equals("\t")) {
tString += "\t";
actualLineLength += 4;
i++;
numberOfT++;
}
text += tString;
} else if(symbols[i].equals("force newline")) {
text += "\n";
actualLineLength = 0;
i++;
if(tString != "") {
tString = "";
numberOfT = 0;
lineWithT = false;
}
} else if(actualLineLength + symbols[i].length() + 1 > lineLength) {
text += "\n";
actualLineLength = 0;
if(lineWithT) {
text += tString;
actualLineLength += numberOfT * 4;
}
}
}
PrintWriter pr = new PrintWriter(outputFile);
pr.println(text);
pr.close();
}
public static void main(String[] args) throws Exception {
Sequence s = new Sequence(args[0], args[1], Integer.parseInt(args[2]), true);
}
}
Example
Input file
Dieses Programm liest einen Text ein und schreibt diesen in eine neue Datei, wobei die Zeilen eine gewisse Anzahl an Zeichen nicht übersteigt.
Es müssen einzelne Symbole unterschieden werden. Die Unterscheidung erfolgt durch das Erkennen von Leerzeichen und Zeilenumbrüchen.
Programmschritte:
Erkenne Symbole
Schreibe Symbole in neue Datei, überschreite Dateilänge nicht
Hier steht noch unnötiger Text zu Demonstrationszwecken:
Habt euch alle lieb
tut euren Nachbarn gutes
1. Thema
- Erläuterung lorem Ipsum dolorenti für 400 Euro
- Spaß ist was ganz tolles und macht Freude
- Do you know de way? We must save the queen. Everyone clap for the queen
2. Blumentopf
Output file with 30 characters per line
Dieses Programm liest einen
Text ein und schreibt diesen
in eine neue Datei, wobei die
Zeilen eine gewisse Anzahl an
Zeichen nicht übersteigt.
Es müssen einzelne Symbole
unterschieden werden. Die
Unterscheidung erfolgt durch
das Erkennen von Leerzeichen
und Zeilenumbrüchen.
Programmschritte:
Erkenne Symbole
Schreibe Symbole in neue
Datei, überschreite
Dateilänge nicht
Hier steht noch unnötiger
Text zu
Demonstrationszwecken:
Habt euch alle lieb
tut euren Nachbarn
gutes
1. Thema
- Erläuterung lorem Ipsum
dolorenti für 400 Euro
- Spaß ist was ganz
tolles und macht Freude
- Do you know de way? We
must save the queen.
Everyone clap for the
queen
2. Blumentopf