Toon posts:

[Java] Flush probleem bij BufferedWriter

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een programma geschreven die files aanpast en dan wegschrijft naar een ftp mbv BufferedWriter, gewrapped rond een OutputStreamWriter. Het probleem is nu dat hij na een aantal bytes ofzoiets niets meer print... Ik flush na elke lusloop de writer, maar het probleem blijft dezelfde.

De output zie je hier: http://www.dezwaluw.org/verg/Wolven.txt

Java:
1
2
3
4
5
6
7
8
9
OutputStream outStream = ftp.storeFileStream(takNaam+".txt");
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(outStream));
for(int i = 0; i < n; i += 2) {
    outWriter.write(nieuweVergaderingen.get(i)+"="+nieuweVergaderingen.get(i+1));
    if(i != n - 2) outWriter.newLine();
    outWriter.flush();
}
outWriter.close();
ftp.disconnect();


Iemand enige ideeën?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 26-09 09:20

Haan

dotnetter

Al met de debugger gekeken wat er in de loop gebeurt?
Waar komt de waarde van n vandaan? Is dat de lengte van je lijst?

Je kan trouwens zo te zien beter iets van een HashTable gebruiken waarin je key/value pairs kunt opslaan.

[ Voor 17% gewijzigd door Haan op 03-12-2008 13:34 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu net met de debugger zitten volgen (de flush skipte ik wel, want daar begreep ik niets van), en ik snap nu nog minder wat er fout gaat... die laatste zin staat er nu wel volledig op. Loop ik het programma zonder debugger, stopt die zin weer aan de "w" van "willen".

Die n is idd de lengte van de lijst.
Ja een hashtabel zou idd beter zijn, maar het lukte er even niet mee dus ben even voorlopig voor een lijst gegaan.


edit: als ik meermaals save, stopt de file soms zelf al aan de 9e regel (die wel volledig afgeprint is), andere keren stopt hij dan aan de w van willen

[ Voor 15% gewijzigd door Verwijderd op 03-12-2008 14:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb nog wat zitten googlen, maar vind het probleem maar niet...

Iemand die hier wat ervaring mee heeft en weet wat er fout gaat?

Ik werk met eclipse btw.

[ Voor 43% gewijzigd door Verwijderd op 03-12-2008 19:20 ]


Acties:
  • 0 Henk 'm!

  • kw4h
  • Registratie: Februari 2008
  • Laatst online: 22-09 09:00
Je kan proberen in plaats van 'outWriter.write' 'outWriter.print' te gebruiken.
Ik weet niet uit mn hoofd hoe groot, en of het anders reageert, maar ik dacht dat er een verschil zat met karakterconversie of iets dergelijks.

Uiteraard kan het ook zoiets zijn om een newline achter de laatste regel te proppen. Buffered objecten zijn altijd veel bezig met die dingen. Zoals je met een BufferedReader met readLine() data op kan halen.

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Je hebt slechts een deel van je code getoond. Handel je de excepties wel correct af? Dwz, je onderdrukt ze niet, maar je werpt ze direct of je logt op z´n minst de complete stacktrace. De FTP server kan bijvoorbeeld zomaar de connectie hebben afgesloten omdat je een of ander limiet hebt benaderd of iets dergelijks, maar dat zou een duidelijke exceptie hebben afgeworpen.
kw4h schreef op woensdag 03 december 2008 @ 19:54:
Je kan proberen in plaats van 'outWriter.write' 'outWriter.print' te gebruiken.
BufferedWriter heeft geen print() methode. Daarnaast is de character encoding hier echt geen issue.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BufferedWriter heeft geen print, of heb je dan een andere writer op het oog?

Ik heb nu ook eens geprobeerd met altijd een newline te printen (dus niet niet bij de laatste print zoals ik eerst deed), maar dat doet geen verschil...

Er is toch iets raars met de buffer hoor, iemand?

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Hoelang blijf je mijn reactie nog negeren? Als je er niks van snapt, zeg dat dan gewoon :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lol BalusC, ik was bezig met te zoeken om alle ftp acties te printen :p Om te zien of de server idd de verbinding afsloot of iets dergelijk.
Het laatste dat dit afprint als ik de file op de server zet is:
"STOR Wolven.txt
150 Connecting to port 5001"

Ik vang allesinds een IOException op, dat zou mij toch moeten melden als er iets fout gaat met de ftp?

[ Voor 17% gewijzigd door Verwijderd op 03-12-2008 20:52 ]


Acties:
  • 0 Henk 'm!

  • kw4h
  • Registratie: Februari 2008
  • Laatst online: 22-09 09:00
Als je in die loop de tekst die je wegschrijft, ook naar de System.out wegschrijft - is er dan een verschil in output?
Als er geen verschil is, dus de tekst in je console ook ineens afkapt, dan zit de fout waarschijnlijk ergens anders.

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 25-09 22:31

CoolGamer

What is it? Dragons?

OutputStreamWriter maakt ook gebruik van een buffer, dus als je die niet flusht blijft de data daarin staan. Je moet die flush dan plaatsen na de flush van BufferedWriter of je moet de BufferedWriter weghalen en direct in de OutputStreamWriter schrijven.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 26-09 13:22
TheCoolGamer schreef op woensdag 03 december 2008 @ 23:05:
OutputStreamWriter maakt ook gebruik van een buffer, dus als je die niet flusht blijft de data daarin staan. Je moet die flush dan plaatsen na de flush van BufferedWriter of je moet de BufferedWriter weghalen en direct in de OutputStreamWriter schrijven.
BufferedWriter.flush() roept ook direct de flush() methode van de onderliggende Writer aan. Dit is dus niet nodig.

Waar ik nog aan zat te denken: gebruik je ook meerdere threads? Is het mogelijk dat bijvoorbeeld de outStream door een andere Thread net iets te vroeg gesloten wordt?

Dit zou ook een verklaring kunnen zijn waarom je het gedrag in debug-modus niet kan simuleren. Probeer daarnaast eens de flush() methode buiten de loop te plaatsen. Als je elke keer dat kleine stukje gaat flushen, kun je net zo goed de BufferedWriter er om tussen uit slopen...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@kw4h: Nee dat heb ik al eens geprobeerd, in de System.out is alles normaal

@TheCoolGamer: als de flush van een wrappende writer geflusht wordt, worden toch ook de streams die hij wrapt geflusht? http://java.sun.com/j2se/...va/io/Writer.html#flush()
Nuja ik heb zowel het expliciet flushen van de OutputStreamWriter na het flushen van de BufferedWriter als de BufferedWriter weghalen geprobeerd, en beiden gaven hetzelfde probleem...

Toch bedankt! Nog ideeën aub? :)


edit: @Marcj: ik gebruik geen Threads, en de flush na de loop zetten heb ik ook al geprobeerd, geen succes spijtig genoeg :(

[ Voor 11% gewijzigd door Verwijderd op 03-12-2008 23:48 ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 25-09 22:31

CoolGamer

What is it? Dragons?

Ik heb even in de handleiding gekeken van FTPClient:
Returns an OutputStream through which data can be written to store a file on the server using the given name. If the current file type is ASCII, the returned OutputStream will convert line separators in the file to the NETASCII format (i.e., you should not attempt to create a special OutputStream to do this). You must close the OutputStream when you finish writing to it. The OutputStream itself will take care of closing the parent data connection socket upon being closed. To finalize the file transfer you must call completePendingCommand and check its return value to verify success.
Ik zie dat niet in je code.
http://commons.apache.org...#completePendingCommand()

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok dat was het dus inderdaad...Weer te haastig geweest en dat niet gelezen

Heel erg bedankt :)

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 25-09 22:31

CoolGamer

What is it? Dragons?

Je had natuurlijk outStream kunnen vervangen door een ander soort stream om te kijken waar het precies aan lag. Mijn fijn dat je het gevonden hebt.

offtopic:
If all else fails read the manual :+

[ Voor 56% gewijzigd door CoolGamer op 04-12-2008 00:22 ]

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
Waarom gebruik je niet een gratis FTP client library? Er zijn er genoeg te vinden tegenwoordig. Waarom zou je het wiel opnieuw willen uitvinden?

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Het probleem was 3 dagen geleden al opgelost én de TS gebruikt al een gratis FTP client library, dus wat je precies wilt met je post is mij onduidelijk.

"Any sufficiently advanced technology is indistinguishable from magic."

Pagina: 1