Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine HTML-Datei, in welche ich immer Ausgaben speichern möchte, wenn der User etwas klickt.
Code:
private void saveItemActionPerformed(java.awt.event.ActionEvent evt) {
try{
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("solutions.html")));
String outputText = solutionAreaPane.getText();
outputText.replace("<html>","");
outputText.replace("</html>","");
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat( "dd.MM.yy HH:mm" );
outputText = "
<div align=\"right\">[i]" + dateFormat.format(date) + "[/i]</div><hr />" + outputText;
out.writeUTF(outputText);
out.close();
}
catch(IOException e) {
System.err.println(e.toString());
}
}
Das funktioniert auch so wie es soll und gedacht war. Einziges Problem ist das er mir vor dem String den er speichern soll zusätzlich ein scheinbar zufälliges oder aus dem String errechnetes Symbol speichert. Dieses ist ganz am Anfang der Datei. Zb: å, ·, Ô oder Ó. Gleicher String = gleiches Symbol.
Ich kann zwar nicht nachvollziehen was einem das bringen soll, aber das ist ja auch egal. Wie kann ich denn die ersten 2 Bytes aus einer Datei entfernen? Entsprechen die ersten 2 Bytes bei reinem Text auch den ersten 2 Zeichen? Dann könnte ich ja replaceFirst("..",""); machen oder?
First, two bytes are written to the output stream as if by the writeShort method giving the number of bytes to follow. This value is the number of bytes actually written out, not the length of the string. Following the length, each character of the string is output, in sequence, using the modified UTF-8 encoding for the character.
FileInputStream fin = new FileInputStream();
BufferedInputStream bin = new BufferedInputStream(fin);
DataInputStream in = new DataInputStream(bin);
// ...
byte[] data = outputText.getBytes("UTF-8");
bin.flush();
fout.write(data)
ich denke du solltest mal nachlesen was der DataOutput/InputStream genau macht und dann entschreiden ob du den wirklich willst, ich denke ehr nicht.
Ein DataOutputStream ermöglicht es, primitive Datentypen in definierter (und portabler) Weise auszugeben. So geschriebene Daten können mithilfe eines DataInputStream wieder eingelesen werden.
Quelle: "Handbuch der Java-Programmierung" 4. Auflage Seite 464
Doch ich denke schon das ich das will. Ich möchte eine HTML-Seite generieren lassen und sie wenn Daten hinzukommen auch modifizieren/erweitern. Dazu muss ich auch evtl schon erstellte Seiten einlesen. Bin ich da so falsch?
Vielen Dank für deinen Tipp, doch hat der zur Folge das der input nicht mitgenutzt wird. Das verstehe ich nicht da der String doch auch den Input beinhaltet ???:L
Code:
/**
* This method saves the solution in an html-file.
* @param function The function (method) that was performed
*/
public static void saveSolution(String function) {
String inputText= "";
try{
DataInputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("solutions.html")));
inputText = in.readUTF();
}
catch(IOException e) {
System.err.println(e.toString());
}
try{
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("solutions.html")));
String outputText = inputText;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat( "dd.MM.yy HH:mm:ss" );
outputText = outputText + "
<div align=\"right\"><font style=\"color: #0000FF;\">" + function + " - " + dateFormat.format(date) + "</font></div><hr />" + MainFrame.solutionAreaPane.getText();
outputText = outputText.replaceAll("<html>","");
outputText = outputText.replaceAll("</html>","");
outputText = outputText.replaceAll("<head>","");
outputText = outputText.replaceAll("</head>","");
outputText = outputText.replaceAll("<body>","");
outputText = outputText.replaceAll("</body>","");
outputText = outputText.replaceAll("<title>TITLE - " + Main.langGet("solution") + "</title>","");
outputText = outputText.replaceAll("\n\n","\n");
outputText = "<html>\n<head><title>TITLE - " + Main.langGet("solution") + "</title></head>\n<body>" + outputText + "</body></html>";
byte[] data = outputText.getBytes("UTF-8");
out.write(data);
out.close();
if( !autoSave() ) JOptionPane.showMessageDialog(null, Main.langGet("saveSuccess") + System.getProperty("user.dir"));
}
catch(IOException e) {
System.err.println(e.toString());
}
}
ja ich hatte mich vertan, das sollten die outputstreams sein, sonst machts doch keinen sinn ...
wie du korrekt zitierst sollte man die mit dataoutputstream geschriebenen daten auch wieder mit einem datainputstream lesen. der dataoutputstream hat sein eigenes format wie er die daten schreibt. damit dieser aber z.B. weiß wie lang ein string ist denn er einlesen muss schreibt er eben die länge davor - genau das willst du ja nicht, du willst nur die daten, also nimm gleich den fileinputstream.
den bufferedoutputstream solltest du vorher flushen, da dieser (wie der name schon sagt) die daten puffert, und daher u.U. manche daten die du zuvor in den bufferedoutputstream geschrieben hast noch noch in den fileoutputstream geschreiben sind, dann hast du eine inkonsistente datei ...
ok, da ja der Dataoutputstream auch write(byte[]) hat kann man natürlich das flush davor weglassen.
aber vor dem wiederverwenden würde ich noch einstellbar machen in welchem encoding die datei gelesen wird, im moment wird sie immer als utf-8 interpretiert, was man nicht immer will.
des weiteren ist dein
Code:
inputText += (char) read
sehr inperformant. lass lieber den DataInputStream weg und benutze BufferedInputStream.readLine() zum lesen und einen StringBuffer zum speichern anstatt des InputText-Strings. bzw könnte man auch byte[] lesen, in einen byteArrayOutputStream schreiben und mit dem resultat dann einen neuen string im gewünschten encoding erstellen.