Wątek przeniesiony 2014-12-02 16:02 z Java przez bogdans.

Odczytywanie z pliku, zapis do JTable

0

Witam, mam plik textowy który zawiera takie linijki (plik w załączniku), chce aby program napisany w javie odczytywał z tego pliku od drugiej linii oraz dzielił każdą linie po znakach "|" i "#" oraz te podzielone dane dodawał do kolumn w JTable np.

Przykładowy plik zawierający linijki wygląda tak:

Szczecin|Myśliwska|12|40
Szczecin|Słoneczna|13|50
Warszawa|Chopina|1|49

Przykład JTable z nazwami kolumn ID, Nazwa miasta, Nazwa ulicy, Numer domu, Numer mieszkania

i chce aby jedna linia z tego pliku odpowiadało jednemu rekordowi z danymi umieszczonymi w odpowiednich kolumnach.

I moje pytanie brzmi lepiej użyć metody Scanner czy może czegoś innego?

kod odpowiadający za import pliku

public void wczytajPlik() {
	        FileDialog fd = new FileDialog(this, "Choose a file", FileDialog.LOAD);
		fd.setVisible(true);
		katalog = fd.getDirectory();
		plik = fd.getFile();
		fileLabel.setText("Wybrano plik: " + plik);
		directoryfileLabel.setText("W katalogu: " + katalog);
	    if (plik == null) {
	    	JOptionPane.showMessageDialog (null, "Nie wybrano pliku", "Błąd", JOptionPane.INFORMATION_MESSAGE);
	    }
	}

dodanie znacznika <code> - @furious programming

0

A w Java 7 za pomocą czego to zrobić?
Jak zrobić aby Scanner czytał plik z podanej ścieżki którą pobieram ze zmiennej katalog oraz plik?

0
Scanner sc = new Scanner(fd.getfiles()[0]);
0

jest jeszcze opcja (akurat tutaj po prostu wypisuje to, co wczyta):

public void wypiszDaneZPliku(String path) //path - ścieżka do pliku
	{
        InputStream input = getClass().getResourceAsStream(path);
		Scanner in = new Scanner(input);
		//żeby było łatwiej to scanner pomocniczy:
		Scanner line;
		while (in.hasNextLine())
		{
			line = new Scanner(in.nextLine());
			line.useDelimiter("|");
			while(line.hasNextLine())
				System.out.print(line.nextLine().trim() + " ");
			System.out.println();
			
		}
	}
0

Gdy robie to co podaliście to wyskakuje błąd w konsoli

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at java.io.Reader.<init>(Unknown Source)
	at java.io.InputStreamReader.<init>(Unknown Source)
	at java.util.Scanner.<init>(Unknown Source)
	at ExternalPanel1.wypiszDanezpliku(ExternalPanel1.java:60)
	at ExternalPanel1.wczytajPlik(ExternalPanel1.java:52)
	at ExternalPanel1.actionPerformed(ExternalPanel1.java:81)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Kod programu importujący i wczytujący plik

public void wczytajPlik() {
		fd.setVisible(true);
		katalog = fd.getDirectory();
		plik = fd.getFile();
		fileLabel.setText("Wybrano plik: " + plik);
		directoryfileLabel.setText("W katalogu: " + katalog);
		wypiszDanezpliku(katalog + plik);
	    if (plik == null) {
	    	JOptionPane.showMessageDialog (null, "Nie wybrano pliku", "Błąd", JOptionPane.INFORMATION_MESSAGE);
	    }
	}
	
	public void wypiszDanezpliku(String path) {
		InputStream input = getClass().getResourceAsStream(path);
        Scanner in = new Scanner(input);
        //żeby było łatwiej to scanner pomocniczy:
        Scanner line;
        while (in.hasNextLine())
        {
            line = new Scanner(in.nextLine());
            line.useDelimiter("|");
            while(line.hasNextLine())
                System.out.print(line.nextLine().trim() + " ");
            System.out.println();
 
        }
	}
1

Po pierwsze, kolejność

        wypiszDanezpliku(katalog + plik);
        if (plik == null) {
            JOptionPane.showMessageDialog (null, "Nie wybrano pliku", "Błąd", JOptionPane.INFORMATION_MESSAGE);
        }

jest absurdalna. Wpierw próbujesz czytać z pliku, a dopiero potem sprawdzasz czy plik jest różny od nulla.
Po drugie, nie opuszczasz pierwszego wiersza.
Po trzecie, @Naitoreivun napisał zły kod

        boolean firstLine = true;
        try
        {
            Scanner sc = new Scanner(fd.getFiles()[0]);
            while(sc.hasNextLine())
            {
                if(firstLine)
                {
                    sc.nextLine();
                    firstLine = false;
                }
                else
                {
                    Scanner line = new Scanner(sc.nextLine());
                    line.useDelimiter("\\|");
                    while(line.hasNext())
                    {
                        System.out.println(line.next());
                    }
                }
            }
            
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        
0

To może napisz wam jaką aplikację chce napisać, bo być może podacie mi lepsze rozwiązanie na napisanie tej aplikacji.
A więc chce napisać aplikację w które użytkownik loguję się za pomocą loginu i hasła i gdy wpiszę poprawne dane logowania to ukazuję się okienko w którym użytkownik wybiera plik o nazwie log_2014-12-06-16-14.txt, w którym podczas grania w grę Euro Truck Simulator 2 są generowane linijki, które zawierają informację dotyczące grania np. prędkość jazdy, spalanie, przebieg itd. Chce aby te linijki były dzielone po znakach "|" oraz "#", następnie chce ten plik odczytywać na okrągło dopóki gracz nie wyłączy gry ponieważ wtedy już nie są generowane żadne linijki w tym pliku. Podczas wczytywania chce te podzielone dane umieszczać w JTable w odpowiednich kolumnach tzn prędkość w kolumnie prędkość, spalanie w kolumnie spalanie. Następie chce wybrać odpowiednie dane z JTable i wysyłać je do bazy danych do tabeli o nazwie takiej samej jak login czyli wybieram np. kolumny prędkość, spalanie i wysyłam je do tej tabeli do kolumn prędkość i spalanie oraz chce aby podczas każdego nowo utworzonego rekordu była wpisywana data do kolumny data oraz godzina do kolumny godzina, ponieważ dzięki temu będę mógł napisać stronę w PHP która odczytuję i prezentuję te dane zebrane od wielu użytkowników na stronie. Poniżej przedstawiam kod tej aplikacji, który już napisałem

Kod pliku o nazwie MainPanel.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

class MainPanel extends JFrame implements ActionListener {

	ExternalPanel1 ep1 = new ExternalPanel1();
	JPanel p1 = new JPanel(new GridBagLayout());
	JButton loginButton = new JButton("Zaloguj się");
	JButton infoButton = new JButton("O Programie");
    JLabel labelUsername = new JLabel("Wpisz login: ");
    JLabel labelPassword = new JLabel("Wpisz hasło: ");
    JTextField textUsername = new JTextField(20);
    JPasswordField fieldPassword = new JPasswordField(20);
	Connection conn;
	Statement stat;
	ResultSet rs;
	String uname;
	String pwd;
	String l;
	String p;
	boolean wynik;
	boolean wynik2;
    
	public static void main(String[] args) {
		
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
		
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainPanel().setVisible(true);
            }
        });
	}
	public MainPanel() {
		super("GoldenLines ASOK TelemetryApp");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(320, 160));
        //setResizable(false);
        setLocationRelativeTo(null);
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(5, 5, 5, 5);
        c.gridx = 0;
        c.gridy = 0;     
        p1.add(labelUsername, c); 
        c.gridx = 1;
        c.gridy = 0;
        p1.add(textUsername, c);
        c.gridx = 0;
        c.gridy = 1;     
        p1.add(labelPassword, c);        
        c.gridx = 1;
        c.gridy = 1;
        p1.add(fieldPassword, c);
        c.gridx = 0;
        c.gridy = 2;
        p1.add(loginButton, c);
        loginButton.addActionListener(this);
        c.gridx = 1;
        c.gridy = 2;
        p1.add(infoButton, c);
        infoButton.addActionListener(this);
		add(p1);
        p1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Panel Główny"));
        pack();
		
	}
	
	public boolean Connect() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//System.out.println("Steronwik OK");
		} 
		catch (ClassNotFoundException e) {
            System.err.println("Brak sterownika JDBC");
            e.printStackTrace();
            return false;
        }
		try {
            conn = DriverManager.getConnection("jdbc:mysql://host_name/table_name", "user", "password");
            //System.out.println("Połączono");     
            checkLogin();
        } 
		catch (SQLException e) {
            System.err.println("Problem z otwarciem polaczenia");
            e.printStackTrace();
            return false;
        }
		return true;
	}
	
	public boolean checkLogin() {
		char[] temp_pwd=fieldPassword.getPassword();
        pwd=null;
        pwd=String.copyValueOf(temp_pwd);
        uname = textUsername.getText();
        //System.out.println(" " + pwd + " " + uname);

		try {	
			stat = conn.createStatement();
	        rs = stat.executeQuery("SELECT login, password FROM aso_users where login='"+uname+"' AND password='"+pwd+"'");
	        while (rs.next()) {
	        	l = rs.getString("login");
	        	p = rs.getString("password");
	        	//System.out.println("LoginOK: "+l);
	        	//System.out.println("HasłoOK: "+p);	        	
	        }
		}
		catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public void closeConnect() {
		try {
            conn.close();
        } 
		catch (SQLException e) {
            System.err.println("Problem z zamknieciem polaczenia");
            e.printStackTrace();
        }
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object akcja = e.getSource();
		if(akcja == loginButton) {
			Connect();
			if (Connect() == true && checkLogin() == true) {
				if (l.equals(uname) == true && p.equals(pwd) == true) {
					//closeConnect();
					ep1.setVisible(true);
					setVisible(false);
					
				}
			}
		}
		else if (akcja == infoButton) {
			JOptionPane.showMessageDialog (null, "Autor: \nWersja: 0.1", "O programie", JOptionPane.INFORMATION_MESSAGE);
		}
	}
}

Kod pliko o nazwie ExternalPanel1.java

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ExternalPanel1 extends JFrame implements ActionListener {

	JPanel p1 = new JPanel(new GridBagLayout());
	JButton logoutButton = new JButton("Wyjście");
	JButton importButton = new JButton("Wczytaj plik telemetrii");
	FileDialog fd = new FileDialog(this, "Choose a file", FileDialog.LOAD);
	String katalog;
	String plik;
	JLabel fileLabel = new JLabel("Wybrano plik:");
	JLabel directoryfileLabel = new JLabel("W katalogu:");
	
	public ExternalPanel1() {
		super("GoldenLines ASO TelemetryApp");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(440, 200));
        //setResizable(false);
        setLocationRelativeTo(null);
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.WEST;
        c.insets = new Insets(5, 5, 5, 5);
        c.gridx = 0;
        c.gridy = 1;
        p1.add(fileLabel, c);
        c.gridx = 0;
        c.gridy = 2;
        p1.add(directoryfileLabel, c);
        c.gridx = 0;
        c.gridy = 3;
        p1.add(importButton, c);
        importButton.addActionListener(this);
        c.gridx = 0;
        c.gridy = 4;
        p1.add(logoutButton, c);
        logoutButton.addActionListener(this);
		add(p1);
        p1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Panel "));
        pack();		
	}
	
	public void wczytajPlik() {
		fd.setVisible(true);
		katalog = fd.getDirectory();
		plik = fd.getFile();
		//fileLabel.setText("Wybrano plik: " + plik);
		//directoryfileLabel.setText("W katalogu: " + katalog);
	    if (plik == null) {
	    	JOptionPane.showMessageDialog (null, "Nie wybrano pliku", "Błąd", JOptionPane.INFORMATION_MESSAGE);
	    }
	    else {
			wypiszDanezpliku();
	    }
	}
	
	public void wypiszDanezpliku() {
		 boolean firstLine = true;
	        try
	        {
	            Scanner sc = new Scanner(fd.getFiles()[0]);
	            while(sc.hasNextLine())
	            {
	                if(firstLine)
	                {
	                    sc.nextLine();
	                    firstLine = false;
	                }
	                else
	                {
	                    Scanner line = new Scanner(sc.nextLine());
	                    line.useDelimiter("\\|");
	                    while(line.hasNext())
	                    {
	                        System.out.println(line.next());
	                    }
	                }
	            }
	 
	        }
	        catch(Exception e)
	        {
	            System.out.println(e);
	        }
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object akcja = e.getSource();
		if(akcja == logoutButton) {
			System.exit(0);
		}
		if(akcja == importButton) {
			wczytajPlik();
		}
	}
}

I stąd moje pytanie czy da się jakoś tą aplikację lepiej napisać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1