Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Файловый вывод


Автор: Bulat 24.5.2006, 08:33
Есть код:

Код

...
OutputStream os = new FileOutputStream("log.txt");
...
os.write(rs.getInt("billing_id"));
...
os.close();


Или может проблема ограничивается не только в кодировке, потому как в файле отправляю только числа, а получаются каракули  

Автор: Metal_Heart 24.5.2006, 08:39
привет, а ты не делал os.flush() после os.write() ? 

Автор: tux 24.5.2006, 08:44
А если попробовать так?
Код

os.write(Integer.toString(rs.getInt("billing_id")));
 

Автор: Bulat 24.5.2006, 09:16
2Metal_Heart, 

Ничего не дало

2tux, 

так он вообще отказывается работать 

Автор: batigoal 24.5.2006, 09:35
Это, видимо, из-за того, что ты пишешь не в текстовом режиме. Если надо в текстовом, делай так:
Код

...
FileWriter writer = new FileWriter ("log.txt");
...
writer.write(rs.getInt("billing_id"));
...
writer.close();


Добавлено @ 09:37 
Но, вообще-то, для записи логов есть специальные инструменты (например, log4j). Пользоваться ими несложно. 

Автор: Bulat 24.5.2006, 14:59
2Lamer George, 

Так он выбрасывает:

Код

Exception in thread "main" java.lang.Error
    at sun.nio.cs.StreamEncoder$CharsetSE.flushLeftoverChar(StreamEncoder.java:361)
    at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:381)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:124)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:178)
    at Connect.getBillings_data(Connect.java:81)
    at Connect.getLogins_data(Connect.java:108)
    at Connect.run(Connect.java:45)
    at Connect.main(Connect.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)


Какие советы будут по этому поводу, или мне выложить код?  

Автор: batigoal 24.5.2006, 15:41
Выложи код. И проверь, корректно ли у тебя извлекается rs.getInt("billing_id").  

Автор: Bulat 25.5.2006, 09:57
Этот вопрос я дожал, пока до необходимого уровня. Только у меня возник другой, вобще возможно через коды ява создать файл, который потом можно было бы удалить только таким же способом через коды. Проще говоря, чтоб кто-попало не смог с этим файлом сотворить что ему вздумается 

Автор: batigoal 25.5.2006, 10:12
Цитата(Bulat @  25.5.2006,  10:57 Найти цитируемый пост)
Этот вопрос я дожал, пока до необходимого уровня. Только у меня возник другой, вобще возможно через коды ява создать файл, который потом можно было бы удалить только таким же способом через коды. Проще говоря, чтоб кто-попало не смог с этим файлом сотворить что ему вздумается 

Это скорее вопрос к файловой системе. Например, в *NIX-системе ты мог бы создать пользователя, и запретить действия с файлом всем остальным. В винде это тоже возможно.

Но программными средствами ты этого добиться навряд ли сможешь. 

Автор: LSD 25.5.2006, 10:14
Цитата(Bulat @  25.5.2006,  10:57 Найти цитируемый пост)
Только у меня возник другой, вобще возможно через коды ява создать файл, который потом можно было бы удалить только таким же способом через коды. Проще говоря, чтоб кто-попало не смог с этим файлом сотворить что ему вздумается

А можно по русски? 

Автор: Bulat 25.5.2006, 11:08
2LSD,  вапчет Lamer George понял суть моего вопроса и ответил на него. Я в принципе и сам так предпологал, но надежда умирает последней. 

Автор: Beard 25.5.2006, 16:42
Цитата

Только у меня возник другой, вобще возможно через коды ява создать файл, который потом можно было бы удалить только таким же способом через коды. Проще говоря, чтоб кто-попало не смог с этим файлом сотворить что ему вздумается

Посмотри http://javaalmanac.com/egs/java.nio/SetFileLock.html
может это и надо? 

Автор: LSD 28.5.2006, 20:12
Цитата(Bulat @  25.5.2006,  12:08 Найти цитируемый пост)
2LSD,  вапчет Lamer George понял суть моего вопроса и ответил на него. Я в принципе и сам так предпологал, но надежда умирает последней.

Ну не то чтобы это совсем нельзя было сделать, изменить настройки безопасности файловой системы из Java можно через Runtime.exec(). В виндах это можно сделать с помощью cacls. 

Автор: Bulat 29.5.2006, 14:04
Цитата(Beard @ 25.5.2006,  16:42)
Цитата

Только у меня возник другой, вобще возможно через коды ява создать файл, который потом можно было бы удалить только таким же способом через коды. Проще говоря, чтоб кто-попало не смог с этим файлом сотворить что ему вздумается

Посмотри http://javaalmanac.com/egs/java.nio/SetFileLock.html
может это и надо?

М-дя, мало того, что простым Del смог удалить свой файл, я даже изменил его содержимое. Что там делается lock я не понял........ smile  

Автор: Beard 29.5.2006, 15:47
А можно на твой тестовый пример посмотреть?
Лично у меня под виндой все нормально лочится - удалить или изменить не могу 

Автор: Beard 29.5.2006, 18:09
Попробуй для проверки запустить вот это:
Код

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class Locking {
    public static void main(String args[]) throws IOException {
        if (args.length == 0)
            System.out.println("Use \"java Locking filename\"");
        else {
            FileChannel channel = new RandomAccessFile(args[0], "rw").getChannel();
            FileLock lock = channel.lock();//or channel.tryLock(); lock() return FileLock
            try {
                System.out.println("GOT LOCK");
                System.out.println("Now you can try edit or delete file \"" + args[0] + "\"");
                System.out.println("Press ENTER to continue");
                System.in.read(new byte[10]);
            } finally {
                System.out.println("RELEASED LOCK");
                lock.release();
                channel.close();
            }
            System.out.println("OK");
        }
    }
}

Цитата(Bulat @  29.5.2006,  14:04 Найти цитируемый пост)
Что там делается lock я не понял........ 

Вот что написано в Thinking in Java 3 Edition:
Цитата

File locking, introduced in JDK 1.4, allows you to synchronize access to a file as a shared resource. However, the two threads that contend for the same file may be in different JVMs, or one may be a Java thread and the other some native thread in the operating system. The file locks are visible to other operating system processes because Java file locking maps directly to the native operating system locking facility. 

... skipped ...

You get a FileLock on the entire file by calling either tryLock( ) or lock( ) on a FileChannel. (SocketChannel, DatagramChannel, and ServerSocketChannel do not need locking since they are inherently single-process entities; you don’t generally share a network socket between two processes.) tryLock( ) is non-blocking. It tries to grab the lock, but if it cannot (when some other process already holds the same lock and it is not shared), it simply returns from the method call. lock( ) blocks until the lock is acquired, or the thread that invoked lock( ) is interrupted, or the channel on which the lock( ) method is called is closed. A lock is released using FileLock.release( ). 

It is also possible to lock a part of the file by using

    tryLock(long position, long size, boolean shared)
or
    lock(long position, long size, boolean shared)

which locks the region (size - position). The third argument specifies whether this lock is shared. Feedback

Although the zero-argument locking methods adapt to changes in the size of a file, locks with a fixed size do not change if the file size changes. If a lock is acquired for a region from position to position+size and the file increases beyond position+size, then the section beyond position+size is not locked. The zero-argument locking methods lock the entire file, even if it grows. Feedback

Support for exclusive or shared locks must be provided by the underlying operating system. If the operating system does not support shared locks and a request is made for one, an exclusive lock is used instead. The type of lock (shared or exclusive) can be queried using FileLock.isShared( )


 

Автор: Bulat 30.5.2006, 10:10
Beard, 

А собственно это что проверяет? Написал, запустил, сработал у меня if, что и так видно потому как args.length == 0 - true 

Автор: Beard 30.5.2006, 11:47
Так в качестве аргумента надо передать путь до файла, который надо залочить, "что и так видно":
Код

java Locking filepath
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)