Wątek przeniesiony 2016-09-11 16:03 z Java przez bogdans.

Poprawny zapis sciezki dostepu z klawiatury

0

Hej, witajcie! krotko bawie sie w programowanie, wiec czesto napotykam problemy. Mam nadzieje, ze pomozecie mi w tym;)

Fragment kodu ponizej:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Scanner;

class Swir_vnir
{
	int option;
	int length;
	String wave_source;
	String pigments_source;
	String pigments_number;
	String final_source;
	
	Swir_vnir()
	{
		this.option = 0;
		this.length = 0;
		this.wave_source = "";
		this.pigments_source = "";
		this.pigments_number = "";
		this.final_source = "";
	}
.
.
.
.
        void get_pigments_source()
	{
		String result;
		Scanner reader = new Scanner(System.in);
		System.out.println("Type path to the data about the pigment you are intrested about");
		result = reader.nextLine();

		this.pigments_source = result;
	} 
.
.
.
.
        String [][] read_data() throws FileNotFoundException
	{
		String [][] means_deviations = new String [2][length];
		File pigments_means = new File(pigments_source);
		File waves = new File(wave_source);
		
		try
		{
			Scanner reader1 = new Scanner(waves);
			Scanner reader2 = new Scanner(pigments_means);
.
.
.
.
                catch(FileNotFoundException ex)
		{
			System.out.println("File cannot be opend");
		}

		return means_deviations;
	}

Mianowicie chodzi o to, ze read_data() wyrzuca mi wyjatek dla pigments_source. Czy wiecie, jak wiec powinien wygladac zapis sciezki do pliku tak, aby program dzialal? Probowalam juz przeroznych rozwiazan, lacznie z zamiana wszystkich "" wprowadzanych z klawiatury na "\" lub "/'. Moze nie w tym problem?

Bylabym wdzieczna za wszelka pomoc;)

1

Miło powitać nową osobę na forum :)
Jednakże polecam przeczytanie na początek:

  1. Formatowanie treści postów na forum
  2. Jak tytułować wątki na forum

Kiedy podajesz ścieżkę do obiektu typu Scanner nie potrzeba \\. Działa dobrze zarówno z \ jak i /.
Podrzuć stacktrace. Nie mówisz jakiego typu wyjątek rzuca. Użyj jednego scannera dla całej klasy (ja przynajmniej bym tak zrobił).
Używaj znaczników <code class="java"> twój kod </code>.

1

Wstawiaj kod w znaczniki <code class="java"></code>
Ścieżka zależy od tego jak plik pigments_means jest położony względem katalogu bieżącego.

0

Burdzi0
Jestem tak zielona, ze nie wiem, co to stacktrace. Piszcie mi, proszę, jak totalnemu zielonkowi!;) o wiele wygodniej mi korzystac z dwoch scannerow, wczytuje z dwoch plikow do jednej tablicy jednoczesnie. moze i owszem wygladaloby to estetyczniej, ale ja po prostu staram sie przetrwac jak na razie;)
bogdans
tylko, ze z wave_length nie mam tego problemu. podaje calkowita sciezke, nie odnoszac sie do katalogu biezacego, jednakze nie robie tego z klawiatury. czy w takim razie to wciaz moze byc problem, o ktorym piszesz?

0

a i po prostu wybiera opcje catch (FileNotFoundException) i wyswietla komunikat w konsoli poza tym nie bruzdzi i nie krzyczy o zadnych innych wyjatkach

0

Czy oba pliki są w tym samym katalogu?
Jak wygląda (w Twoim programie) ścieżka do pliku wave_source
Co wpisujesz gdy program pyta o ścieżkę do pliku pigments_source.
Z Twojego kodu nie wynika, którego pliku nie dało się otworzyć.

    String [][] read_data()
    {
        String [][] means_deviations = new String [2][length];
        File pigments_means = new File(pigments_source);
        File waves = new File(wave_source);
 
        try
        {
            Scanner reader1 = new Scanner(waves);
            Scanner reader2 = new Scanner(pigments_means);
            //...
        } 
        catch(Exception ex)
        {
            System.out.println(ex);
        }
        return means_deviations;
    }
0

wave_source: F:\wszechswiat\esy-floresy\MNK\kamera\pigmenty\biblioteka\SWIR_dlugosci_fali.txt
pigments_source wpisuję zwyczajnie np. : F:\wszechswiat\esy-floresy\MNK\kamera\pigmenty\biblioteka\swir\atakamit_103901.txt

jak widac, sa w roznych katalogach. tak, tak, z kodu nie wynika, jednakze po prostu to sprawdzilam. zakomentowalam wszystkie fragmenty dotyczace pigments_source. te dotyczace wave_length dzialaja w porzadku;)

sam program znajduje sie w katalogu pigmenty, jesli to wazne;)

1

To źle wpisujesz, wpisz F:/wszechswiat/esy-floresy/MNK/kamera/pigmenty/biblioteka/swir/atakamit_103901.txt.
Skoro program jest w katalogu pigmenty i (jak widać) nie używasz instrukcji package, to wystarczy wpisać biblioteka/swir/atakamit_103901.txt.

0

czy nie da sie tego ominac? znaczy sie wpisywania w ten sposob? zaznacze, ze wpakowywalam rowniez w scannera stringa ze sciezka ktory zawieral "/". tylko, ze nie wpisywalam w ten sposob sciezki z klawiatury, tylko zapisawszy ja do jakiegos stringa, zmienilam jej wszystkie "" na "/". rowniez nie podzialalo. czy ma to znaczenie w tej sytuacji? wpisanie inaczej z klawiatury a podanie innego stringa?

0

niestety nie dziala. wpisywanie z klawiatury pelnej sciezki i okrojonej z uzyciem "/" nic nie daje...

0

Obie formy podania ścieżki są poprawne. Jesteś pewna, że plik F:\wszechswiat\esy-floresy\MNK\kamera\pigmenty\biblioteka\swir\atakamit_103901.txt istnieje i jest dostępny?

0

tak, tak, jestem tego pewna;)

moze blad jest gdzie indziej...
moge wkleic calosc kodu, jesli ktokolwiek znajdzie ochote, zeby na to spojrzec...;)

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Scanner;

class Swir_vnir
{
	int option;
	int length;
	String wave_source;
	String pigments_source;
	String pigments_number;
	String final_source;
	
	Swir_vnir()
	{
		this.option = 0;
		this.length = 0;
		this.wave_source = "";
		this.pigments_source = "";
		this.pigments_number = "";
		this.final_source = "";
	}
	
	void choose_option()
	{
		Scanner reader = new Scanner(System.in);
		int result;
		System.out.println("Choose 1 if you want swir or 2 if you want vnir");
		result = reader.nextInt();
		this.option = result;
	}
	
	void get_length_wave()
	{
		if(option == 1)
		{
			this.length = 256;
			this.wave_source = "F:\\wszechswiat\\esy-floresy\\MNK\\kamera\\pigmenty\\biblioteka\\SWIR_dlugosci_fali.txt";
		}
		else if(option == 2)
		{
			this.length = 776;
			this.wave_source = "F:\\wszechswiat\\esy-floresy\\MNK\\kamera\\pigmenty\\biblioteka\\VNIR_dlugosci_fali.txt";
		}
	}
	
	void get_pigments_source()
	{
		String result;
		Scanner reader = new Scanner(System.in);
		System.out.println("Type path to the data about the pigment you are intrested about");
		result = reader.nextLine();

		this.pigments_source = result;
	}
	
	void get_pigments_number()
	{
		Scanner reader = new Scanner(System.in);
		String result;
		System.out.println("Type pigments name and number");
		result = reader.nextLine();
		this.pigments_number = result;
	}
	
	void get_final_source()
	{
		this.final_source = "F:\\wszechswiat\\esy-floresy\\MNK\\kamera\\pigmenty\\biblioteka\\do_obrobki\\" + pigments_number + ".txt";
	}
	
	void create_file() throws IOException
	{
		File plic = new File(final_source);
		if(plic.isFile() == true)
		{
			System.out.println("This file already exists");
		}
		else
		{
			try
			{
				boolean b = plic.createNewFile();
			}
			catch(IOException e)
			{
				System.out.println("File cannot be created");
			}
		}
	}
	
	String [][] read_data() throws FileNotFoundException
	{
		String [][] means_deviations = new String [5][length];
		File pigments_means = new File(pigments_source);
		File waves = new File(wave_source);
		
		try
		{
			Scanner reader1 = new Scanner(waves);
			Scanner reader2 = new Scanner(pigments_means);
			
			for(int i = 0; i < length; i++)
			{
				double number = reader1.nextDouble();
				means_deviations[0][i]= Double.toString(number);
				means_deviations[1][i] = "\t";
			}
			
			reader2.nextLine();
			reader2.nextLine();
			reader2.nextLine();
			reader2.nextLine();
			for(int j = 0; j < length; j++)
			{
				for(int k = 0; k < 3;)
				{
					if(reader2.next() == "\t")
					{
						k++;
					}
				}
				double number = reader2.nextDouble();
				means_deviations[2][j] = Double.toString(number);
				means_deviations[3][j] = "\t";
				number = reader2.nextDouble();
				means_deviations[4][j] = Double.toString(number);
			}
		}
		catch(FileNotFoundException ex)
		{
			System.out.println("File cannot be opend");
		}

		return means_deviations;
	}
	
	void save_data()
	{
		try
		{
			create_file();
			
			String [][] complete_data = read_data();
			FileWriter saver = new FileWriter(final_source,true);
			
			for(int i = 0; i < length; i++)
			{
				for(int j = 0; j < 5; j++)
				{
					saver.write(complete_data[j][i]);
				}
				saver.write("\n");
			}
			
			saver.close();
		}
		catch(IOException ex)
		{
			System.out.println("Something went wrong");
		}
	}
}

public class Doer
{
	public static void main(String[] args) throws FileNotFoundException
	{
		Swir_vnir sth = new Swir_vnir();
		sth.choose_option();
		sth.get_length_wave();
		sth.get_pigments_number();
		sth.get_pigments_source();
		sth.get_final_source();
		sth.read_data();
		//sth.save_data();
	}	
}
0

Napisałem Ci jak ma wyglądać obsługa błędów w funkcji read_data. Zastosuj ten kod i napisz jaki komunikat widzisz na konsoli.

0

Wiem, ze to moze zabrzmi infantylnie, ale moglbys mi moze zdradzic, gdzie to napisales? nigdzie tego nie widze... poprostum nowa...

0

Osiem postów wcześniej.

0

dziekuje,

niestety to samo:

F:\wszechswiat\esy-floresy\MNK\kamera\pigmenty>java Doer
Choose 1 if you want swir or 2 if you want vnir
1
Type pigments name and number
ata
Type path to the data about the pigment you are intrested about
F:\wszechswiat\esy-floresy\MNK\kamera\pigmenty\biblioteka\swir\atakamit_103901.txt
File cannot be opend

0

Nie użyłaś mojego kodu.

0

ah nie zwrocilam uwagi na te jego czesc, juz czynie!

co za zamieszanie... jednak wyswietla to...: java.util.NoSuchElementException

ponadto krzyczy rowniez:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at Swir_vnir.read_data(Doer.java:119)
at Doer.main(Doer.java:176)

w takim razie problem jest juz w

for(int j = 0; j < length; j++)
{
	for(int k = 0; k < 3;)
	{
		if(reader2.next() == "\t")
	       {
			k++;
		}
	}
0

Tzn., że próbujesz odczytać więcej wierszy (elementów z wiersza) niż jest w pliku.
Co Ty chcesz tą pętlą

for(int j = 0; j < length; j++)
{
    for(int k = 0; k < 3;)
    {
        if(reader2.next() == "\t")
           {
            k++;
        }
    }

osiągnąć?
Po pierwsze, Scanner nigdy nie zwróci znaku tabulacji, on wszystkie białe znaki (spacje i tabulacje) pomija.
Po drugie, wartości Stringów w Javie porównuje się inaczej

if(reader2.next().equals("\t"))
0

moj plik zawiera piec kolumn, chce pominac trzy pierwsze i wyekstrahowac dwie ostatnie. teraz wlasnie wpadlam na to, ze scanner tego nie czyta. i faktycznie, wylecialo mi z glowy porownywanie stringow. wielkie dzieki za pomoc. musze w takim razie zmienic calkiem taktyke;)

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